C++とC#の記述方法の違い

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
華尾

C++とC#の記述方法の違い

#1

投稿記事 by 華尾 » 6年前

C#を勉強しています。
アクセス制限の記述方法で疑問がいくつかありまして
詳しい方教えて下さい。

C#では

コード:

class A
{
 public void setage();
 public void disp(); 
 private a;
 private b;
};
と記述されているこれらは
C++の様に

コード:

class A
{
public:
 void setage();
 void disp(); 
private:
 int a;
 int b;
};
と省略出来ないのでしょうか。
出来ないなら、C#はそーいうものだと覚える感じですか?

オブジェクトのフィールド内にある値を取得したり、代入したりするのに
C++では当然の様にゲッターやセッターを個別に作っていたのですが
C#ではそこはプロパティひとつ作れば、事足りるってことでしょうか?
さっきのclass Aに追加するとして、

コード:

public int a{
  get{
   return a;
  }
  set{
   a= value;
  }
}
みたいな。
C#だと、これで他のクラス内で
A.a=1;やA.b=a;などの記述で
aを読むこともaに代入することも容易に出来てしまう、
という認識でよろしいですか?

教えて下さいませ。

hide

Re: C++とC#の記述方法の違い

#2

投稿記事 by hide » 6年前

アクセス修飾子については個別につけるしかありません。そういうものです。

プロパティについては、考え方としてはあってますが記述には注意してください。

コード:

class A {
  public int a {
    get { return a; }
    set { a = value; }
  }
}
この記述で aのセッターを使おうとして

コード:

var a = new A();
a.a = 10;
とすると死にます。Aクラスのaというセッターのプロパティは

コード:

set { a = value; }
が内容ですので、受け取った値を aに対して与えようとします。
しかしこのセッターに記述されているaはAクラスのセッターのプロパティ名ですので、また受け取った値を aに対して与えようとします。
つまり、無限ループになって止まらなくなり、プログラムが落ちます。
この場合、意図した動作であろうコードは以下のような物になります

コード:

class A {
  private int _a;
  public int a {
    get { return _a; }
    set { _a = value; }
  }
}
さらに、こういう場合は以下のような記述でよいです。

コード:

class A {
  public int a {
    get;
    set;
  }
}
この記述ですと、get set の中身が自動的に実装されて、プログラマからみえない変数に自動でget setしてくれます。
オフトピック
記述としては以上になりますが、そもそもsetter,getterを当然のようにつくるような設計は何かがおかしい可能性があります。
getterはある程度仕方ないこともありますが、setterはなるべくいらなくなるような設計のほうが扱いやすくなりやすいでしょう。

華尾

Re: C++とC#の記述方法の違い

#3

投稿記事 by 華尾 » 6年前

hideさん
回答して頂き、ありがとうございます
hide さんが書きました:

コード:

class A {
  public int a {
    get;
    set;
  }
}
[/offtopic]
この記述だと
a = 10;
とやっても無限ループにならない、と言う事ですよね?
しかし、

コード:

class A {
  public int a {
    get { return a; }
    set { a = value; }
  }
}
との違いが私にはわからないのですが、
前者の get;set;のみの記述の方だと、その内容(return aやa = value)を書かずとも
aの値を参照出来たり、aへの代入 をしてくれると言うことでしょうか??
すみません、自分でも変な質問してるかもしれませんが
C#を勉強し始めてるところですので、、

あと、これは推測なんですが、
C#ってC++と違ってグローバル化したいクラスをSingletonしなくても
もともとすべてのクラスがSingletonした状態の様に扱える、って状態ですか?
(というか、C++自体がSingletonしないとグローバルなクラスを作れなかった??)

hide

Re: C++とC#の記述方法の違い

#4

投稿記事 by hide » 6年前

コード:

class A {
  public int a {
    get;
    set;
  }
}
これは自動実装プロパティというもので、コンパイル時に勝手に

コード:

class A {
  private int __a;
  public int a {
    get { return __a; }
    set { __a = value; }
  }
}
のようなコードを生成してくれます。(__aはアクセスプロパティ以外から触れないので、ちょっと違いますが。)

グローバル化したいクラスをSingleton
すみませんが何をおっしゃっているのかわかりません。

返信

“C言語何でも質問掲示板” へ戻る