Skip to content

Instantly share code, notes, and snippets.

View problem-runtime-error-due-to-lack-of-generics.md

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

View packages.config
<?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 Sep 7, 2016
Xamarin.Formsバッドノウハウ ListView編
View gist:11e5bfd1cc368c19ddf693ffd1afe132
・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リソースを上書きする行為なので、注意すること。
View CsspFigure2
void Foo(int x)
{
if (!Range.IsValid(x, ...))
throw new ArgumentOutOfRangeException("x");
...
@qwerty2501
qwerty2501 / CsspCode1
Created Oct 15, 2014
CSharp for system programing code1
View CsspCode1
void Foo(int x)
requires Range.IsValid(x, ...)
{
....
View gist:11218041
private async void Button_Click_1(object sender, RoutedEventArgs e)
{
//ConfigureAwait(false)でUIスレッドに戻さない
await Task.Delay(5).ConfigureAwait(false);
var asyncObject = new AsyncClass();
asyncObject.SomeEventHandler += async()=>
{
View gist:11217686
public class AsyncClass
{
//この通知によってライブラリユーザはUIを更新することが高いと予想される
public event Action SomeEventHandler;
public async Task DoAsync()
{
//ここまでUIスレッドで実行されているとする
//UIスレッドの同期コンテキストをキャッシュする
View gist:11217368
public class AsyncClass
{
//この通知によってライブラリユーザはGUIを更新することが高いと予想される
public event Action SomeEventHandler;
public async Task DoAsync()
{
//ここまでGUIスレッドで実行されているとする
//.ConfigureAwait(false)でUIスレッドに戻さない
View DeadlockGui.cs
/// <summary>
/// GUIアプリケーションのコードビハインド
/// </summary>
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
View NonDeadlock.cs
//ライブラリ側のコード
public static async Task DoAsync()
{
//デッドロックを回避するにはConfigureAwait(false)メソッドを呼び出す
await HeavyWorkAsync().ConfigureAwait(false);
}