Skip to content

Instantly share code, notes, and snippets.

A problem runtime error due to lack of Generics

Introduction

This document is written my experience and thinking about Go.
Go is simple. And it is good that performance in runtime. But in Go I had to write code that is unsafe in some cases.I think that it is caused by lack of Generics.
I will write about them.

Case of json.Unmarshal

<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="DryIoc.dll" version="2.10.1" targetFramework="portable45-net45+win8+wp8+wpa81" />
<package id="Prism.Core" version="6.3.0" targetFramework="portable45-net45+win8+wp8+wpa81" />
<package id="Prism.DryIoc.Forms" version="6.3.0.1" targetFramework="portable45-net45+win8+wp8+wpa81" />
<package id="Prism.Forms" version="6.3.0" targetFramework="portable45-net45+win8+wp8+wpa81" />
<package id="Xamarin.Forms" version="2.3.3.193" targetFramework="portable45-net45+win8+wp8+wpa81" />
</packages>
@qwerty2501
qwerty2501 / gist:11e5bfd1cc368c19ddf693ffd1afe132
Created September 7, 2016 14:11
Xamarin.Formsバッドノウハウ ListView編
・Xamarin.FormsのUWP版ListViewだと仮想化が有効にならない
UWPの仕様上常にListViewは仮想表示されることになっているが、実際には仮想化されず追加したぶんだけListViewItemが生成される。
原因について恐らくではあるが、Xamarin.FormsのUWP版ListViewの実装でUWPのListViewItemのMinHeightを0に設定されているのが原因。
UWPの挙動として、ListViewItemの高さを算出できなかった時にMinheightをもとに仮想表示に必要な高さを求めるようになっているらしく、
仮に1万個追加されたとしてもMinHeightが0だと高さ0のItemが追加されたとみなされるため全て表示しようとする。そのためListViewItemが大量に生成される。
この現象はXamarin.FormsのDatatemplate内のHeightRequestを設定してもなぜか解決しなかった。
この現象を解決するにはUWPのプロジェクト内にあるAppクラスのリソースにFormsListViewItemをKeyとしたStyleリソースにMinHeightに0以外の数値を設定するSetterを定義するか、
もしくはMinHeightのSetterを定義しないことで解決する。(MinHeightは規定値の場合0になるがなぜかListViewItemは大量に生成されない)
ただし、この行為は元々Xamarin.FormsにあるFormsListViewItemリソースを上書きする行為なので、注意すること。
@qwerty2501
qwerty2501 / gist:2943430
Created June 17, 2012 04:40
C#でのニコ動ログイン(動く)
public bool DeepLogin()
{
bool login = false;//ログイン成否
HttpWebRequest req = WebRequest.CreateHttp(new Uri(deepLoginUrl, UriKind.Absolute));
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.CookieContainer = App.ViewModel.UserSetting.cc;
using (StreamWriter sw = new StreamWriter(req.GetRequestStreamAsync().GetAwaiter().GetResult()))
{
@qwerty2501
qwerty2501 / CsspCode1
Created October 15, 2014 12:33
CSharp for system programing code1
void Foo(int x)
requires Range.IsValid(x, ...)
{
....
@qwerty2501
qwerty2501 / CsspFigure2
Created October 15, 2014 12:40
CsspFigure2
void Foo(int x)
{
if (!Range.IsValid(x, ...))
throw new ArgumentOutOfRangeException("x");
...
//ライブラリ側のコード
public class DeadlockSample
{
public static async Task DoAsync()
{
//規定のawaitだとライブラリユーザにWaitされた場合デッドロックになる可能性がある
await HeavyWorkAsync();
}
}
//ライブラリ側のコード
public static async Task DoAsync()
{
//デッドロックを回避するにはConfigureAwait(false)メソッドを呼び出す
await HeavyWorkAsync().ConfigureAwait(false);
}
/// <summary>
/// GUIアプリケーションのコードビハインド
/// </summary>
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
public class AsyncClass
{
//この通知によってライブラリユーザはGUIを更新することが高いと予想される
public event Action SomeEventHandler;
public async Task DoAsync()
{
//ここまでGUIスレッドで実行されているとする
//.ConfigureAwait(false)でUIスレッドに戻さない