<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C#</title><link>http://blogs.wankuma.com/izmktr/category/1785.aspx</link><description>C#</description><managingEditor>出水 洸太郎</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>出水 洸太郎</dc:creator><title>[C#]ああいえばこうユージング</title><link>http://blogs.wankuma.com/izmktr/archive/2008/10/21/159296.aspx</link><pubDate>Tue, 21 Oct 2008 01:37:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2008/10/21/159296.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/159296.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2008/10/21/159296.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/159296.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/159296.aspx</trackback:ping><description>&lt;P&gt;C#のusingが面倒だよね、という話題はよく出てきます。&lt;BR&gt;もっと以下のような感じですっきりかけないものでしょうか。&lt;/P&gt;
&lt;PRE class=CSharp name="code"&gt;
int hoo(string readfile, string writefile){
  (処理1)
  using var sr = new StreamReader(readfile);
  (処理2)
  if(...){
    using var sw = new StreamWriter(writefile);
    (処理3)
    //ここを抜けると、sw.Dispose();が走る
  }
  //ここを抜けるとsr.Dispose();が走る
}
&lt;/PRE&gt;
&lt;P&gt;いわゆる&lt;A href="http://ja.wikipedia.org/wiki/RAII"&gt;RAII&lt;/A&gt;です。&lt;/P&gt;
&lt;P&gt;実はこれに関しては&lt;A href="https://connect.microsoft.com/VisualStudioJapan/feedback/ViewFeedback.aspx?FeedbackID=361184&amp;amp;wa=wsignin1.0"&gt;フィードバックを出していた&lt;/A&gt;のですが、その返事が返ってきました。&lt;BR&gt;まとめるとこんな感じです。&lt;/P&gt;
&lt;P&gt;・C#にはデストラクタないから概念が新しすぎる。&lt;BR&gt;・そもそも、プログラムの作りが複雑なのが問題。&lt;/P&gt;
&lt;P&gt;結局、入れないという結論のようです。&lt;BR&gt;まぁ痛い所を突かれた感じです。&lt;/P&gt;
&lt;P&gt;ライブラリならともかく言語仕様だと&lt;BR&gt;おいそれと受け入れられるとは思えないので当然の結果ですけど。&lt;/P&gt;
&lt;P&gt;で、本題です。&lt;BR&gt;このようにMicroSoft製品にバグや要望を送れる&lt;A href="https://connect.microsoft.com/VisualStudioJapan/Feedback"&gt;フィードバック&lt;/A&gt;があって&lt;BR&gt;しかも日本語で送って翻訳して英語チームに届くので&lt;BR&gt;他にも要望があれば活用すべし！という事ですね。&lt;/P&gt;
&lt;P&gt;(と、ゴマをすってみる)&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/159296.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[C#]スーパー等しい君</title><link>http://blogs.wankuma.com/izmktr/archive/2008/10/06/158336.aspx</link><pubDate>Mon, 06 Oct 2008 23:02:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2008/10/06/158336.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/158336.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2008/10/06/158336.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/158336.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/158336.aspx</trackback:ping><description>&lt;P&gt;Equalsメソッドの実装のお話です。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://ja.wikipedia.org/wiki/%E5%90%88%E5%90%8C%E5%BC%8F"&gt;合同式&lt;/A&gt;を作ってみました。&lt;BR&gt;今回の場合は、13を法とした合同式です。&lt;BR&gt;以下の場合、1と14はどちらも13で割った余りが1になるので、等しいとなるはずです。&lt;/P&gt;&lt;PRE class=CSharp name="code"&gt;class Mod13 {
  uint num;
  public override bool Equals(object obj) {
    var right = obj as Mod13;
    if (right == null) return base.Equals(obj);
    return getMod() == right.getMod();   
  }
  public uint getMod() { return num % 13; }
  public Mod13(uint num) {
    this.num = num;
  }
}
class Program {
  static void Main(string[] args) {
    var a = new Mod13(1);
    var b = new Mod13(14);
    Console.WriteLine("1 ≡ 14 (mod 13) :" + (a == b));
  }
}
&lt;/PRE&gt;&lt;IMG src="http://izmktr.wankuma.com/200810/csresult4.jpg"&gt; 
&lt;P&gt;はい、この通り1と14が等しいことに&amp;#8230;なってないですね。&lt;BR&gt;Equalsをちゃんとオーバーライドしているのに&amp;#8230;おかしいなぁ。&lt;/P&gt;
&lt;P&gt;答え&lt;BR&gt;Equals と operator== は別物です。&lt;/P&gt;
&lt;P&gt;ということで、operator== もちゃんと追加しました。&lt;BR&gt;なぜか、operator!= も作れとコンパイラに怒られたのでそちらも作っています。&lt;BR&gt;これでちゃんと動くはずです。&lt;/P&gt;&lt;PRE class=CSharp name="code"&gt;class Mod13 {
  static public bool operator ==(Mod13 left, Mod13 right) {
    return left.Equals(right);
  }
  static public bool operator !=(Mod13 left, Mod13 right) {
    return !(left == right);
  }
}
&lt;/PRE&gt;&lt;IMG src="http://izmktr.wankuma.com/200810/csresult5.jpg"&gt; 
&lt;P&gt;ぬ、ぬるぽーーーー！？&lt;BR&gt;Equalsの中でoperator== を使っているのが原因らしいです。&lt;/P&gt;
&lt;P&gt;答え&lt;BR&gt;operator== を先に作り、Equals がoperator== を利用するようにしましょう。&lt;/P&gt;
&lt;P&gt;#ObjectがEqualsを持つ必要性がよくわかんない。IHashable のインターフェースでは駄目なの！？&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/158336.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[C#]整数も蒐集する程度の能力</title><link>http://blogs.wankuma.com/izmktr/archive/2008/10/04/158151.aspx</link><pubDate>Sat, 04 Oct 2008 11:24:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2008/10/04/158151.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/158151.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2008/10/04/158151.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/158151.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/158151.aspx</trackback:ping><description>&lt;P&gt;&lt;A href="http://blogs.wankuma.com/izmktr/archive/2008/10/04/158142.aspx"&gt;[C#]構造を蒐集する程度の能力&lt;/A&gt; の続き&lt;/P&gt;
&lt;P&gt;List&lt;INT&gt;ってそんなに使いにくいことになっていたかな？って思ったので&lt;BR&gt;実際に試してみました。&lt;BR&gt;intにカーソルを合わせるとstruct System.Int32 と出るので、&lt;BR&gt;intはstructのはずです。&lt;/P&gt;&lt;PRE class=CSharp name="code"&gt;static void Main(string[] args) {
  var ilist = new List&amp;lt;int&amp;gt;();
  ilist.Add(100);

  Console.WriteLine(ilist[0]);
  ilist[0] += 100;
  Console.WriteLine(ilist[0]);
}
&lt;/PRE&gt;&lt;IMG src="http://izmktr.wankuma.com/200810/csresult2.jpg"&gt; 
&lt;P&gt;動きますね&amp;#8230;そりゃ、List&lt;INT&gt;が使えないといろいろ不便ですしね。&lt;BR&gt;組み込み型だからでしょうか？&lt;/P&gt;
&lt;P&gt;と、流星の如く素晴らしい発想が出た俺参上！&lt;BR&gt;さっきのプログラムはこう書けばいいんだ！！&lt;/P&gt;&lt;PRE class=CSharp name="code"&gt;static void Main(string[] args) {
  var poslist = new List&amp;lt;Position&amp;gt;();
  poslist.Add(new Position(100, 200));
  poslist[0].Print();

  var tmp = poslist[0];
  tmp.swap();
  poslist[0] = tmp;

  poslist[0].Print();
}
&lt;/PRE&gt;&lt;IMG src="http://izmktr.wankuma.com/200810/csresult3.jpg"&gt; 
&lt;P&gt;つまり、肝は代入演算子なわけです。&lt;BR&gt;これがあれば謎のロジック50袋が炸裂してうまくいくと。&lt;BR&gt;なんでこんなまどろっこしいことになっているんでしょうね！！&lt;/P&gt;
&lt;P&gt;結論&lt;BR&gt;・追跡参照をください&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/158151.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[C#]構造を蒐集する程度の能力</title><link>http://blogs.wankuma.com/izmktr/archive/2008/10/04/158142.aspx</link><pubDate>Sat, 04 Oct 2008 04:42:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2008/10/04/158142.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/158142.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2008/10/04/158142.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/158142.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/158142.aspx</trackback:ping><description>&lt;P&gt;以下のプログラムをコンパイルして実行した結果、どうなるでしょう。&lt;/P&gt;&lt;PRE class=CSharp name="code"&gt;struct Position {
  public int x, y;
  public void Print() {
    Console.WriteLine(x.ToString() + "," + y.ToString());
  }
  public void swap() {
    int tmp = x;
    x = y;
    y = tmp;
  }
  public Position(int x, int y) {
    this.x = x;
    this.y = y;
  }
}
static void Main(string[] args) {
  var poslist = new List&amp;lt;Position&amp;gt;();
  poslist.Add(new Position(100, 200));
  poslist[0].Print();
  poslist[0].x += 300;
  poslist[0].Print();
}
&lt;/PRE&gt;
&lt;P&gt;なんと、コンパイルできません。&lt;BR&gt;"エラー CS1612: 変数ではないため、'System.Collections.Generic.List&amp;lt;strlist.Program.Position&amp;gt;.this[int]' の戻り値を変更できません。"&lt;BR&gt;こんなエラーが出るんですね。&lt;/P&gt;
&lt;P&gt;では、このように関数の内部で値を変更してはどうでしょう。&lt;/P&gt;&lt;PRE class=CSharp name="code"&gt;static void Main(string[] args) {
  /* Positionの定義は上のソースと同じ */
  var poslist = new List&amp;lt;Position&amp;gt;();
  poslist.Add(new Position(100, 200));
  poslist[0].Print();
  poslist[0].swap();
  poslist[0].Print();
}
&lt;/PRE&gt;&lt;IMG src="http://izmktr.wankuma.com/200810/csresult1.jpg"&gt; 
&lt;P&gt;今度はコンパイルはできますが、予想通りswap()での交換は行われていません。&lt;/P&gt;
&lt;P&gt;問題はposlist[0]の部分ですね。&lt;BR&gt;上で出たエラーから推測すると、poslist[0]はposlist[0]ではありません。&lt;BR&gt;poslist[0]の内容がコピーされたものが帰ってきているわけです。&lt;/P&gt;
&lt;P&gt;Listに入れているものがclassであれば、実体を指し示す位置なので&lt;BR&gt;コピーされたものであっても問題がありません。&lt;BR&gt;しかし、今回はstructですので、コピーされたものを更新してしまい、&lt;BR&gt;実際のposlist[0]の中身はまったく更新されないわけですね。&lt;/P&gt;
&lt;P&gt;poslist[0].xとかやると、それ更新しても意味ないよって事でしょう。&lt;/P&gt;
&lt;P&gt;ということで、結論です。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;struct と Collections は相性が悪いので組み合わせないようにしましょう。&lt;/LI&gt;
&lt;LI&gt;追跡参照&amp;#8230;追跡参照さえあればこんなことには&amp;#8230;！！&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;#List&amp;lt;int&amp;gt;はまずいの？という話になりそうなんですが、その辺はもうちょっと調べて書きます。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/158142.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[C#]ユージングインパクト</title><link>http://blogs.wankuma.com/izmktr/archive/2008/09/29/157755.aspx</link><pubDate>Mon, 29 Sep 2008 20:31:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2008/09/29/157755.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/157755.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2008/09/29/157755.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/157755.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/157755.aspx</trackback:ping><description>&lt;P&gt;C#のusingは便利ですが、ネストが深くなるという問題もあります。&lt;BR&gt;そう愚痴ると、同時に宣言するなら並べて書くことができる、という&lt;BR&gt;解決策を提案をされることがよくあります。&lt;/P&gt;&lt;PRE class=Cpp name="code"&gt;// ネストが深いなぁ&amp;#8230;
using(var a = new ClassA()){
  using(var b = new ClassB()){
    using(var c = new ClassC()){
      ...
    }
  }
}
// こうすると、ネストが1段で済む
using(var a = new ClassA())
using(var b = new ClassB())
using(var c = new ClassC()){
  ...
}
&lt;/PRE&gt;
&lt;P&gt;だけど、よーく考えると以下の書き方はあまりしませんよね。&lt;/P&gt;&lt;PRE class=Cpp name="code"&gt;for (int x = 0; x &amp;lt; 30; x++)
for (int y = 0; y &amp;lt; 30; y++)
for (int z = 0; z &amp;lt; 30; z++){
  ...
}
if (a == 0)
if (b == 0)
if (c == 0){
  ...
}
&lt;/PRE&gt;
&lt;P&gt;途端に冒頭の解決策が不安になってきます。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/157755.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>[C#]注目の的</title><link>http://blogs.wankuma.com/izmktr/archive/2008/07/13/148682.aspx</link><pubDate>Sun, 13 Jul 2008 12:23:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2008/07/13/148682.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/148682.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2008/07/13/148682.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/148682.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/148682.aspx</trackback:ping><description>&lt;PRE class=CSharp name="code"&gt;var result = data.Where(O=&amp;gt; 0 &amp;lt;=O);&lt;/PRE&gt;0以上がほしい時にどうぞ。&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/148682.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>出水 洸太郎</dc:creator><title>匿名デリゲート</title><link>http://blogs.wankuma.com/izmktr/archive/2008/05/30/140160.aspx</link><pubDate>Fri, 30 May 2008 03:12:00 GMT</pubDate><guid>http://blogs.wankuma.com/izmktr/archive/2008/05/30/140160.aspx</guid><wfw:comment>http://blogs.wankuma.com/izmktr/comments/140160.aspx</wfw:comment><comments>http://blogs.wankuma.com/izmktr/archive/2008/05/30/140160.aspx#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://blogs.wankuma.com/izmktr/comments/commentRss/140160.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/izmktr/services/trackbacks/140160.aspx</trackback:ping><description>&lt;P&gt;おそらく、3年前にすでに語りつくされたネタだと思いますが&amp;#8230;。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;C#の匿名デリゲートは、ただの書式的な問題だけ、と思っていたのですが、&lt;/P&gt;
&lt;P&gt;なぜローカル変数を引き継げるんですか！！&lt;/P&gt;&lt;PRE class=CSharp name="code"&gt;List&amp;lt;FUNC&amp;gt; func 
for(int i = 0; i &amp;lt; 3; i++){
  int a = 10;
  func.Add(delegate(){Console.Writeline(a);});
}
foreach(var f in func) f();
&lt;/PRE&gt;
&lt;P&gt;これで、「10, 10, 10」と出力されます。(カンマは改行)&lt;/P&gt;&lt;PRE class=CSharp name="code"&gt;for(int i = 0; i &amp;lt; 3; i++){
  int a = i;
  func.Add(delegate(){Console.Writeline(a);});
}
foreach(var f in func) f();
&lt;/PRE&gt;
&lt;P&gt;こう書き換えれば、「0,1,2」 と出ますね。&lt;/P&gt;&lt;PRE class=CSharp name="code"&gt;for(int i = 0; i &amp;lt; 3; i++){
  func.Add(delegate(){Console.Writeline(i);});
}
foreach(var f in func) f();
&lt;/PRE&gt;
&lt;P&gt;ですが、こう書き換えてしまうと&amp;#8230;出力は「3,3,3」 です&lt;/P&gt;
&lt;P&gt;ここで出力されるiはforでカウンタとして使っているiですから、&lt;/P&gt;
&lt;P&gt;forを抜けた時はiは3のはずです。&lt;/P&gt;
&lt;P&gt;そのiが出力されているんだからなんら不思議なことは&amp;#8230;大有り過ぎる！！&lt;/P&gt;
&lt;P&gt;C++なら間違いなく開放済みアドレスを指してますよ、これ！&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;なお、&lt;A href="http://msdn.microsoft.com/ja-jp/library/0yw3tz5k.aspx"&gt;MSDN&lt;/A&gt;によると外部変数という扱いになり、開放済みアドレスを指すことはありません。&lt;/P&gt;
&lt;P&gt;宣言時ではなく呼び出し時の値を参照することから、&lt;/P&gt;
&lt;P&gt;実質引数が増えているのと変わらない使い方が出来て便利ですが、&lt;/P&gt;
&lt;P&gt;今更ながらフリーダム過ぎる構文ではないかなぁと思います。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/izmktr/aggbug/140160.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>