このブログを検索

ラベル

C# (6) Objective-C (2) Qt (2) .NET (1) Visual Studio (1)
ラベル C# の投稿を表示しています。 すべての投稿を表示
ラベル C# の投稿を表示しています。 すべての投稿を表示

2011年5月11日水曜日

【C#】refやoutは共変でも反変でもない

More Effective C#を読んでいて気になったことがあったのでメモ。
それは「refやoutは共変でも反変でもない」です。言葉より、ソースを示します。

上記の例ではref Parent型の仮引数に対してParentのサブクラスのSub型を実引数として渡そうとして、エラーになっています。つまり、共変ではないという事です

ならばrefやoutを使わないで実装しようと思っても、「メソッドの戻り値として複数の値を得たい」場合はrefやoutを使いたくなります。

そこで本書では、戻り値をタプルにすれば良いと言っています。タプルとは順序付きのデータ集合のことで、一連のデータをグループ化するために使用できます(と、プログラミングF#には書いてありました)。

戻す値が3つ以上なら、単純にT3、T4、…と別途定義をします。

2011年5月10日火曜日

【C#】コンテナに格納したコントロールを取り出す順序

GroupBoxなどのコンテナクラスにコントロールを追加するには以下のようにします。


コンテナからforeachなどでコントロールを取り出すには以下のようにします。

感覚的には取り出す順序はAddした順になると考えますが、実際はそうならないことがあります。

対処方法
SetChildIndex()メソッドでコンテナ内のコントロールの順序を設定しておけば、設定した順序でコントロールを取り出すことが出来ます。

2011年4月22日金曜日

【C#】ウィンドウの位置・サイズを前回終了したときと同じにする

Formのプロパティを修正

  • Formのプロパティの(ApplicationSettings)の(PropertyBinding)のボタンをクリック
  • ClientSizeとLocationの項目のリストから「(新規...)」をクリック
  • DefaultValueとNameに適当な値を入力する。DefaultValueはこの設定の初期値になり、Nameは、この設定の名称となる。
    • 後からDefaultValue?を変更したい場合は、プロジェクトのプロパティを開き、「設定」画面から行える。



Formが閉じられるときに設定値を保存する。 

最小化すると、ウィンドウが小さくなってしまうバグの対処

  • FormのLoad時に、設定が変更された時にメソッドを呼び出すようにする

  • 設定が変更された時に呼び出されるメソッドには、最小化・最大化の時は設定を変更しないようにする

2011年4月21日木曜日

【C#】テキストファイルを任意の場所から読む方法

テキストファイルは始めから一行ずつ読み込んでいくのが普通ですが、以下の方法を使うとテキストファイルの途中から読み始めることが出来ます。詳細は、http://d.hatena.ne.jp/funayoi/20080120/1200837828 を参照してください。

ちなみに、ファイルの位置はStreamReader?オブジェクトのPositionプロパティで取得できます。

【C#】LINQの集合演算

ListやDictonaryなどのIEnumerableインタフェイスを実装しているクラスに対して、LINQの集合演算が使えて便利です。

一意な要素の集合
以下の例は、listの重複する要素を取り除きます。
以下の例のdistinctListの要素は、「Ada」と「ALGOL」と「C#」と「COBOL」と「Java」となります(Adaは一つだけ)。


和集合
以下の例は、listの末尾にlist2を結合させます。そして、「O」を含む要素のみを取り出します。
以下の例のunionList の要素は、「ALGOL」と「COBOL」と「Objective-C」となります。



積集合
以下の例は、listとlist2の積をとります。 以下の例のintersectListの要素は、「C#」と「Java」になります。


差集合 
以下の例は、listからlist2を引きます。 以下の例のexceptListの要素は、「Ada」と「ALGOL」と「COBOL」になります。

【C#】XMLシリアライズ可能なジェネリックのDictionary

ジェネリックのDictionaryは、XmlSerializerでシリアライズできません。 以下のソースは、それを可能にします。
詳細は、http://weblogs.asp.net/pwelter34/archive/2006/05/03/444961.aspx を参照してください。