[C#] read-onlyなオブジェクト (frozenなオブジェクト)

Petzoldの本で「この1行を変えるとエラーが出るよ。」と説明されていたところを、一応試してみようとテスト。
「Applications = code + Markup」  Chapter2より:

class VaryTheBackground : Window
{
//SolidColorBrush brush = new SolidColorBrush(Colors.Black);  こちらが正しいソースコード
SolidColorBrush brush = Brushes.Black;
[STAThread]
(略)
      protected override void  OnMouseMove(MouseEventArgs args)
   {
        (略)
Color clr = brush.Color;
clr.R = clr.G = clr.B = bylevel;
brush.Color = clr;         //ここでエラー
}
   (略)

コメント行が元の正しいソースコード。それをほぼ同じ動作だろうと、直接クラスオブジェクトを代入すると、コンパイル、起動はエラーがなく実行時エラーが最後の代入で発生する。
これは、Brushクラスが返すSolidColorBrushオブジェクトがfronzenな状態だからだ。
コメントアウトしている方の記述(元の正しいもの)ではbrushがfronzenではないので変更できる。
frozenを変更しようとすると実行時エラーとして例外Invalid Operation Exceptionが発生する。例外の理由は:

オブジェクト ‘#FF000000’ は読み取り専用状態であるため、プロパティを設定できません。

となる。
Brushesクラスを使う場合には、複製メソッドを使って変更可能な複製を作る
SolidColorBrush brush = Brushes.Black.Clone();
に変更すると変更可能になる。

広告
%d人のブロガーが「いいね」をつけました。