【.NET】"愛々,123".IndexOf(",")が不正な結果を返す

  • 2008.12.03 Wednesday
  • 08:21
説明
文字によって、string.IndexOf()が不正な結果を返却します。.NET Framework 1.1ではこの現象は起きません。

https://connect.microsoft.com/VisualStudioJapan/feedback/ViewFeedback.aspx?FeedbackID=381451


先月、話題になっていた愛々ですが、ここがネタ元だったのかしら?

【.NET】.NET Framework Libraries. Available Source Code Components

  • 2008.11.30 Sunday
  • 09:53
2,3日前に下記のサイトを見ると

.NET Framework Libraries
http://referencesource.microsoft.com/netframework.aspx

すべてのプロダクトがダウンロードのリンクが無くなっていて
ダウンロード不可になっていることを確認しましたが
先ほどのぞいてみると

・NET Version 8.0
・FX1434 Version 1.0
・dotnetfx35SP1_3053 Version 1.1

の3つがダウンロード可能な状態に戻ったようです。

さらに

・dotnetfx35SP1_3053 Version 1.3

と言うのが追加されているようなので早くダウンロード可能にならないかな〜と
思う今日この頃です。



Configuring Visual Studio for Debugging
http://referencesource.microsoft.com/serversetup.aspx
いろいろなサイトで紹介されている方法ですが、まあ公式サイトが一番参考になるかなと思い、紹介しておきます。

【Book】細部切れわたる「Pro C# 2008 and the .NET 3.5 Platform」

  • 2008.11.29 Saturday
  • 17:43
Pro C# 2008 and the .NET 3.5 Platform (Windows.Net)
Pro C# 2008 and the .NET 3.5 Platform (Windows.Net)
Andrew Troelsen


C#3.0と.NET Frameworkに関してカバーしている範囲が広いです。

【Book】手の届く範囲に置いておきたくなる「C# 3.0 in a Nutshell」

  • 2008.11.29 Saturday
  • 03:04
C# 3.0 in a Nutshell (In a Nutshell (O¥'Reilly))
C# 3.0 in a Nutshell (In a Nutshell (O¥'Reilly))
Joseph Albahari,Ben Albahari


洋書ですけど、すごくいい感じです。
まとめ方や表現方法がすばらしいです。

【.NET】Dynamic Language Runtime

  • 2008.11.28 Friday
  • 20:02
Dynamic Language Runtime

http://www.codeplex.com/dlr/

The Dynamic Language Runtime enables language developers to more easily create dynamic languages for the .NET platform. In addition to being a pluggable back-end for dynamic language compilers, the DLR provides language interop for dynamic operations on objects. The DLR has common hosting APIs for using dynamic languages as libraries or for scripting in your .NET applications. This project provides one stop shopping for the DLR components, our open source implementations of IronPython and IronRuby, documentation, and samples.


要チェックや!

【.NET】プロパティ間ロジックの実現 その1

  • 2008.11.28 Friday
  • 02:45
Binding

Source and Project

先日、自作したBindingを考察したいと思います。

まず、PropertyChangedEventManagerを経由せずに直接に
Source → Targetをあつかった場合は
INotifyPropertyChangedのPropertyChangedEventHandlerを
Targetが直接ハンドルするということになります。
一番、シンプルな形です。

Binding

IWeakEventListenerの価値をあまり理解していないのでこういうことを書くのは
大変、勇気がいることですが、つまりSourceのハンドラをTarget(リスナー)がハンドルすると
SourceがTargetへの参照を保持して、適切なタイミングで
ガベージュコレクトすることができないってことらしいです。
ええ。MSDNの受け売りです。

Bindingなど、SourceとTarget(リスナー)が互いに独立していたい場合は
なるべく弱い参照であることが望まれるということでしょうか・・・書いていて不安です(笑)

という訳で、WeakEventManagerで登録されたイベントをとりあえず受け付けて
適切なリスナーに変更を通知してくれるように、
前回作成したBindingはWeakEventManagerを使用しているわけです。

さて、そのトンチ絵が下記のとおりです。

Binding

TargetとListenerは分離して、SourceとListenerは、互いに独立しています。
WeakEventManagerのなかの実装を見ないとはっきりとわかりませんが、
弱い参照以上の参照レベルが実現できていると思われます。

しかし、ListenerとTargetが前回の実装ではListenerがTargetを参照しており(たぶん)
これってまずいような気がするなぁ〜って思ったので、
ちょこっと実装をいじって弱い参照をイベントハンドラ内で使用するようにしてみました。

つまりSourceからListenerへ変更通知が伝わり
さらにListenerのリスナーであるTargetへ変更通知は
Targetがガベージュコレクトされていない限りは通知する。
さらにTargetはListenerと独立してガベージュコレクトの対象となる。
という実装にしてみました(したつもりです)

では、コードを

弱い参照を一時的に強い参照へ昇格させるオブジェクトを実装してみました。

AliveObject.cs
--------------------------------------------------
 internal class AliveObject : IDisposable
 {
  public AliveObject(WeakReference reference)
  {
   // NOTE: 下記の順序を入れ替えてはいけない。
   Data = reference.Target;
   IsActive = reference.IsAlive;
  }

  public object Data { get; private set; }
  public bool IsActive { get; private set; }

  public void Dispose()
  {
   Data = null;
  }
 }



PropertyBindingOperation.cs
-----------------------------------------------------
 public static class PropertyBindingOperation
 {
  public static void SetBinding(object target, string path, PropertyBinding binding)
  {
   if (target == null || string.IsNullOrEmpty(path) || binding == null)
    throw new ArgumentException();
   SetUpdateTarget(path, binding, new WeakReference(target));
  }

  private static void SetUpdateTarget(string path, PropertyBinding binding, WeakReference targetWeakReference)
  {
   binding.UpdateTarget += delegate(object sender, PropertyChangedEventArgs e)
          {
           var source = sender as INotifyPropertyChanged;
           if (source == null)
            return;

           object value;
           if (!source.TryGetValue(e.PropertyName, out value))
            return;

           // ToDo: Converterなどをここで行う。

           SetValueToTarget.Execute(targetWeakReference, path, value);
          };
  }


  private static bool TryGetValue(this INotifyPropertyChanged source, string propertyName, out object value)
  {
   value = null;
   Type type = source.GetType();
   PropertyInfo propertyInfo = type.GetProperty(propertyName);
   if (propertyInfo == null)
    return false;
   value = propertyInfo.GetValue(source, null);
   return true;
  }
 }

 static class SetValueToTarget
 {
  public static void Execute(WeakReference targetWeakReference, string path, object value)
  {
   using (AliveObject targetObject = targetWeakReference.GetTargetObject())
   {
    if (targetObject.IsActive)
     targetObject.Data.SetValue(path, value);
   }
  }

  private static AliveObject GetTargetObject(this WeakReference weakReference)
  {
   return new AliveObject(weakReference);
  }

  private static void SetValue(this object target, string path, object value)
  {
   Type targetType = target.GetType();
   MethodInfo methodInfo = targetType.GetProperty(path).GetSetMethod();
   if (methodInfo == null)
    throw new ArgumentException();
   methodInfo.Invoke(target, new[] { value });
  }
 }


データと取り出す部分、データを挿入する部分、あとその間でコンバートと
Binding内での操作のタイミングやバリエーションがいろいろあるので
このあたりをいろいろやっちゃうのは楽しそうです。


PropertyBinding.cs
----------------------------------------------------
 public class PropertyBinding : IWeakEventListener
 {
  public PropertyBinding(INotifyPropertyChanged source, string path)
  {
   if (source == null)
    throw new ArgumentNullException();

   sourceRef = new WeakReference(source);
   Path = path;
   PropertyChangedEventManager.AddListener(source, this, path ?? string.Empty);
  }

  private readonly WeakReference sourceRef;
  public INotifyPropertyChanged Source
  {
   get { return sourceRef.Target as INotifyPropertyChanged; }
  }

  public string Path { get; private set; }

  public bool ReceiveWeakEvent(Type managerType, object sender, EventArgs e)
  {
   if (CanUpdateTarget(managerType, e))
    UpdateTarget(sender, (PropertyChangedEventArgs) e);
   else
    return false;
   return true;
  }

  private bool CanUpdateTarget(Type managerType, EventArgs e)
  {
   return managerType == typeof(PropertyChangedEventManager) &&
     e is PropertyChangedEventArgs &&
     UpdateTarget != null;
  }

  public event PropertyChangedEventHandler UpdateTarget;
 }

Sourceも参照を出すようにしてみました。

さてさて、これからなんですが、
Bindingはそのままにして、SourceとTargetのオブジェクトを変更し遊んでみようかなって思ってます。

普通、演算を行う場合、オブジェクトとオブジェクトの間に演算子を配置しますが、
演算子を固定し、オブジェクトを好きな場所に置くというプログラミングっていうのが
実現できるのかなってわけのわからないことを、想像しています。

Binding




で、最後の妄想です。

Binding




最初っから最後までもうそうでした。ごめんなさい。

Source and Project

【.NET】弱いつながりでWeakReference

  • 2008.11.27 Thursday
  • 02:48
WeakReference

Source and Project

昨日、IWeakEventListenerを紹介させていただきました。
それで今日は「弱い」つながりでWeakReferenceを動きをちょっとだけみてみました。

WeakReferenceはMSDNの噂によると...

WeakReference クラス
"弱い参照" を表します。弱い参照は、オブジェクトがガベージ コレクションによるクリアの対象になっている状態のままで、そのオブジェクトを参照します。

http://msdn.microsoft.com/ja-jp/library/system.weakreference.aspx


MSDNのサンプルコードはなかなか奇妙奇天烈で、わかりにくいです。

ということで、今回はシンプルなサンプルコード書いてみて動きを見てみました。
これはむしろGC.Collect()の動きを確かめているだけのような気がしなくでもないわけですが・・・


 class Program
 {
  static void Main(string[] args)
  {
   var weakReferenceList = new List<WeakReference>();
   var referenceList = new List<Data>();

   for (int i = 0; i < 12; i++)
   {
    var data = new Data();
    if (i % 2 == 0)
     referenceList.Add(data);
    weakReferenceList.Add(new WeakReference(data, false));
    data = null;
   }

   GC.Collect();

   foreach (WeakReference weakReference in weakReferenceList)
   {
    var data = (Data) weakReference.Target;
    if (data != null)
     Console.WriteLine(weakReferenceList.IndexOf(weakReference) + " is Alive.");
    else
     Console.WriteLine(weakReferenceList.IndexOf(weakReference) + " is not Alive.");
   }
  }
 }

 class Data
 {
  public Data()
  {
   Item = new byte[1024];
  }
  public int Index { get; set; }
  public object Item { get; set; }
 }


ちなみに

   for (int i = 0; i < 12; i++)
   {
    ...
    data = null;
   }

のdata = nullを入れていなくて、必ず最後の項目がガベージュコレクトされず
Listの末尾だから?なんてアホな想像を5分ぐらいしてしまいました。

実行結果は下記のとおり
------------------------------
0 is Alive.
1 is not Alive.
2 is Alive.
3 is not Alive.
4 is Alive.
5 is not Alive.
6 is Alive.
7 is not Alive.
8 is Alive.
9 is not Alive.
10 is Alive.
11 is not Alive.

WeakReferenceは誰からも参照されていないものを集める場合に便利そうです。
いや、むしろ参照されているものを集めるのに便利そうと言うべきか・・・。



絵で描いたらわかりやすいなぁ〜って思って書いてみました。

TargetとなるオブジェクトをA, B, WeakReferenceのオブジェクトが
それぞれ参照していたとします。
このときは当然、AとBが参照しているのでTargetオブジェクトはGCの対象とはなりません。

WeakReference


しかし、AとBの参照が何らかの理由でなくなり、WeakReferenceだけが
Targetオブジェクトを参照していた場合、TargetオブジェクトはGCの対象となります。

WeakReference


さらにガベージュコレクト走るとTargetオブジェクトはゴミ箱へ行ってしまい、
WeakReferenceの参照先はnullになってしまいます。
そのためWeakReferenceのオブジェクトがたとえばwという名前だった場合
w.Targetはnullを返すわけです。

WeakReference



ちなみに絵を使って説明したかったわけではなく
単にゴミ箱が書きたかったというのは内緒にしておいてください。


Source and Project

【.NET】.NET Framework再入門 2

  • 2008.11.22 Saturday
  • 18:32
プログラミングMicrosoft .NET Framework 第2版 (マイクロソフト公式解説書)
プログラミングMicrosoft .NET Framework 第2版 (マイクロソフト公式解説書)
ジェフリー リッチャー,Jeffrey Richter,吉松 史彰

一年ぐらい前に購入した本です。購入当時はサッパリだったのですが、最近読み直すと、めちゃ面白いことがいっぱい書かれていることい気づき、読み直しています。

【.NET】.NET Framework再入門

  • 2008.11.22 Saturday
  • 18:28
Essential .NET ― 共通言語ランタイムの本質
Essential .NET ― 共通言語ランタイムの本質
ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰

今、上記の本を読んでいます。2003年に発売された本なので、.NET Frameworkの歴史からみるとずいぶんと古い本だと思いますが、今でも全然通用する内容ですね。ものすごく面白いです。最近買った本なのですが、これを知らない私は相当モグリなのかしれません。ええ。

【.NET】いつの間にかHashSet<T>がいた訳で...

  • 2008.11.20 Thursday
  • 01:53
HastSet

Source and Project

.NET Framework 3.5からですか・・・ということは去年の暮れ頃には存在していたはずなんですが、最近まで気づかずにいました。

何かと言うとHashSet<T>です。

Dictionary<T, K>で代用していました。ははは。

つーことで基本動作の確認です。

  static void Main(string[] args)
  {
   var set = new HashSet<string>(new[] {"Cat", "Dog", "Cat", "Monkey", "Dird", "Fish", "Big", "Cat"});
   foreach (var item in set)
    Console.Write("{0}, ", item);
   Console.WriteLine();

   for (int i = 0; i < 5; i++)
    set.Add("Cat");

   foreach (var item in set)
    Console.Write("{0}, ", item);
   Console.WriteLine();
  }



実行結果
------------------------
Cat, Dog, Monkey, Dird, Fish, Big,
Cat, Dog, Monkey, Dird, Fish, Big,


Setなので当たり前ですが、
CatをHashSet<T>に何度つっこもうが1つしか存在できません。

HashSet<T>はICollection<T>, IEnumerable<T>, IEnumerableを継承しているようです。

コンストラクタの中に

public HashSet(IEqualityComparer<T> comparer);
public HashSet(IEnumerable<T> collecion, IEqualityComparer<T> comparer);

というのがあるので、独自なルールで一意な制約を設けることができるようです。


たとえばうそつきクラスを作成してみます。

 class DummyCompaer : IEqualityComparer<string>
 {
  public bool Equals(string x, string y)
  {
   return false;
  }

  public int GetHashCode(string obj)
  {
   if (obj == null)
    return 0;
   return obj.GetHashCode();
  }
 }

常に比較するオブジェクトがfalseを返すので、
先ほどのコードを

var set = new HashSet<string>(new[] { "Cat", "Dog", "Cat", "Monkey", "Dird", "Fish", "Big", "Cat" });

から

IEqualityComparer<string> comparer = new DummyCompaer();
var set = new HashSet<string>(new[] { "Cat", "Dog", "Cat", "Monkey", "Dird", "Fish", "Big", "Cat" }, comparer);

に変えて実行すると...

Cat, Dog, Cat, Monkey, Dird, Fish, Big, Cat,
Cat, Dog, Cat, Monkey, Dird, Fish, Big, Cat, Cat, Cat, Cat, Cat, Cat,

と、Catが入れた分だけHashSetに挿入されていることがわかります。

HashSet<T>にはいろいろとMethodが用意されているので
面白そうですが、今回はこのあたりで打ち止めにしておきます(眠い)


Source and Project

calendar

S M T W T F S
   1234
567891011
12131415161718
19202122232425
2627282930  
<< April 2020 >>

あわせて読みたい

あわせて読みたいブログパーツ

selected entries

categories

archives

recent comment

  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    art55 (05/22)
  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    分解大好き (05/18)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/04)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    Gen (02/04)
  • 【キーボード】RealForce が壊れて帰ってきた。
    art55 (04/29)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/23)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    かるあ (02/22)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    art55 (01/16)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    karuakun (01/16)
  • 【NetOffice】【Excel】死なないExcelプロセスをKillする。
    art55 (12/05)

recent trackback

recommend

recommend

recommend

C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION)
C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION) (JUGEMレビュー »)
Sasha Goldshtein,Dima Zurbalev,Ido Flatow,サシャ・ゴルドシュタイン,ディマ・ズルバレフ,イド・フラトー

recommend

ろんりと集合
ろんりと集合 (JUGEMレビュー »)
中内 伸光
とてもわかりやすいです。

recommend

recommend

シャノン・ノイマン・ディジタル世界
シャノン・ノイマン・ディジタル世界 (JUGEMレビュー »)
市川 忠男
4章がリレーショナルデータベースな内容になってます。ページ数があまりありませんが、ポイントがものすごく的確にまとまっていて、感動します。

recommend

recommend

東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS
東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS (JUGEMレビュー »)

テンキーレス、静音のRealForce91UBK-S。スコスコ感がたまらなく気持ちいいです。家と会社で2台持ってます。

recommend

recommend

プログラミング.NET Framework 第4版 (プログラミングシリーズ)
プログラミング.NET Framework 第4版 (プログラミングシリーズ) (JUGEMレビュー »)
Jeffrey Richter
発売予定美 2013年10月10日。.NET Frameworkとお付き合いする人のバイブルですね。

recommend

recommend

キャット・シッターの君に。
キャット・シッターの君に。 (JUGEMレビュー »)
喜多嶋 隆
私のイラストレータデビュー本です。

recommend

Essential .NET ― 共通言語ランタイムの本質
Essential .NET ― 共通言語ランタイムの本質 (JUGEMレビュー »)
ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM