LoginSignup
daiki130412
@daiki130412 (だいき)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

C#のプロパティ(戻り値・型)について

解決したいこと

C#のプロパティに関すること

発生している問題

戻り値がbool型のプロパティで、get,setを設定
特定の値のときにtrueとなるような内容だが、setブロックの内容が理解できない

該当するソースコード

bool (プロパティ名)
{
    get => 〇〇 != ✕✕
    set => 〇〇 = value ? ✕✕ : △△;
}



自分で試したこと

getは〇〇と✕✕を比較しているのでboolを返すのは分かります。
setについては代入されたbool値に応じて✕✕または△△が設定されると思います。

この場合にbool値が設定される流れがいまいち分かりません。
予想としてはgetとsetが同時に(?)実行されるのかな、と考えています。

ご回答の程よろしくお願いします。

0

2Answer

value ? ✕✕ : △△ を評価した値(value が真なら ✕✕、偽なら △△ )が 〇〇 に代入されます。

1

Comments

  1. @daiki130412

    Questioner

    ご回答いただきありがとうございます。

    追加でお聞きしたいことがあります。
    例えばvalueにtrueを代入した場合、✕✕が〇〇に代入されると思います。
    このとき、プロパティの値はgetブロックを通じてbool値に変換される、という理解で間違いないでしょうか?

    初学者で質問の意図が分かりにくいかもしれませんが、再度のご回答をよろしくお願いいたします。

  2. そのような変換は起きません。 〇〇 には ✕✕ がそのまま代入されます。

  3. @daiki130412

    Questioner

    ご回答いただきありがとうございます。

    私のコードでは、メンバ変数(質問内の✕✕と△△)がColor型(?/構造体?)で、○○がBackColorです。

    疑問点としては、BackColorがgetterではColor型(?)の値の比較をしていて、setterではbool値の代入が行われていることが理解できていません。

    分かりずらい質問で申し訳ありませんが、ご回答宜しくお願い致します。

〇〇とか××とか△△とかの型が何で、どこから来たのですか? 多分すべて bool 型の変数で、以下のように定義されていると想像しています。(質問するならこの程度は書いてください。〇〇とか書くのは避けることをお勧めします。読みにくいので)

public class MyClass
{
    private bool circle;
    private bool triangle;
    private bool cross;

    public bool MyProperty
    {
        get => circle != cross;
        set => circle = value ? cross : triangle;
    }
}

であれば、例えば、

var myClass = new MyClass();

myClass.MyProperty = true;

とすると、setter で、value は true なので三項演算子 value ? cross : triangle の結果は cross になり、それが cricle に代入されます。

1

Comments

  1. @daiki130412

    Questioner

    ご回答いただきありがとうございます。
    以後、コードの書き方に気を付けます。

    メンバ変数として、Color On ,Color Off があり
    bool State
    {
    get => BackColor != Off;
    set => BackColor = value ? On : Off;
    }

    というコードです。
    疑問点としては、valueに代入できる値の型に制限があるのかどうかです。
    setterではvalueにはbool型を入れなければならないと思います。
    一方でgetterではbool型だと成立しないように思えます。

    恐れ入りますがご回答の程よろしくお願いいたします。

  2. 疑問点としては、valueに代入できる値の型に制限があるのかどうかです。
    setterではvalueにはbool型を入れなければならないと思います。

    その通りです。State プロパティに代入できるのは true または false のみとなります。

    一方でgetterではbool型だと成立しないように思えます。

    getter の BackColor != Off で比較演算子 != が返すのは bool 型です。なので問題ありません。

    比較演算子 (C# リファレンス)
    https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/comparison-operators

  3. @daiki130412

    Questioner

    ご回答いただきありがとうございます。
    何度も追加で聞いてしまい申し訳ございません。

    (現在の理解度)
    Stateプロパティにbool値を代入したとき(setter)
    ⇒BackColorにbool値が代入され、OnまたはOffがプロパティに設定される

    Stateプロパティから値を取得するとき(getter)
    ⇒比較演算の結果がbool型で返される

    (疑問点)
    ・BackColorの型はsetterではbool型でgetterではColor型(?)に見えるが、この考え方で良いのかどうか
    ・プロパティはbool型と思いますが、setterでOnやOffは設定(?)しても良いのか?

    お忙しいところ恐縮ですが、ご回答いただけますと幸いです。

  4. ・BackColorの型はsetterではbool型でgetterではColor型(?)に見えるが、この考え方で良いのかどうか

    違います。BackColor の型は setter でも getter でも Color 型です。setter と getter で型が変わるなんてことは C# の世界ではあり得ません。

    ・プロパティはbool型と思いますが、setterでOnやOffは設定(?)しても良いのか?

    コードは set => BackColor = value ? On : Off; なので当たり前に On または Off を BackColor に設定できます。三項演算子の意味が分かってないようです。勉強してください。

  5. @daiki130412

    Questioner

    勉強不足で申し訳ございませんでした。
    ご回答ありがとうございました。

Your answer might help someone💌