ページ 1 / 1
C++とC#の記述方法の違い
Posted: 2017年12月08日(金) 14:44
by 華尾
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に代入することも容易に出来てしまう、
という認識でよろしいですか?
教えて下さいませ。
Re: C++とC#の記述方法の違い
Posted: 2017年12月09日(土) 14:58
by hide
アクセス修飾子については個別につけるしかありません。そういうものです。
プロパティについては、考え方としてはあってますが記述には注意してください。
コード:
class A {
public int a {
get { return a; }
set { a = value; }
}
}
この記述で aのセッターを使おうとして
コード:
var a = new A();
a.a = 10;
とすると死にます。Aクラスのaというセッターのプロパティは
が内容ですので、受け取った値を 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#の記述方法の違い
Posted: 2017年12月10日(日) 15:11
by 華尾
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しないとグローバルなクラスを作れなかった??)
Re: C++とC#の記述方法の違い
Posted: 2017年12月10日(日) 19:50
by hide
コード:
class A {
public int a {
get;
set;
}
}
これは自動実装プロパティというもので、コンパイル時に勝手に
コード:
class A {
private int __a;
public int a {
get { return __a; }
set { __a = value; }
}
}
のようなコードを生成してくれます。(__aはアクセスプロパティ以外から触れないので、ちょっと違いますが。)
グローバル化したいクラスをSingleton
すみませんが何をおっしゃっているのかわかりません。