2017-08-10 6 views
-1

プログラムでは、私は犬の品種をコンソールに書いています。オブジェクトからフィールドの値を返す最も良い方法

どのアプローチが最適ですか?その理由は何ですか?

最初の方法では操作が少なくても、それを行うには変数をpublicとして宣言する必要があると思います。

プライベート宣言し、2番目のライドラインで行ったような方法でデータを返すのがよいでしょうか?

ゲッターと、このメソッドを使用しての間に実質的な違いがあります:

私はソフトウェア

class Program 
{ 
    static void Main(string[] args) 
    { 
     Dog fuffy = new Dog("Fuffy", "Armant"); 
     Console.WriteLine(fuffy.breed); 
     Console.WriteLine(fuffy.getBreed()); 
    } 
} 


class Dog 
{ 
    public string name; 
    public string breed; 

    public Dog(string name, string breed) 
    { 
     this.name = name; 
     this.breed = breed; 
    } 

    public string getBreed() 
    { 
     return this.breed; 
    } 
} 

編集の最高の検討すべての重要な側面であるアプローチの種類を理解したいと思いますか?

ゲッターは、そのメソッドを記述して実行するための「隠された」方法ではありませんか?

ゲッターはメソッドと比較してより良いプリステーションを与えていますか?

class Dog 
{ 
    public string name { get; } 
    public string breed { get; } 

    public Dog(string name, string breed) 
    { 
     this.name = name; 
     this.breed = breed; 
    } 

    public string getBreed() 
    { 
     return this.breed; 
    } 
} 
+0

の方法は、(おそらく古い)は、Javaの方法です。 C#にはプロパティがあります。 – krillgar

+0

この答えを見てください:https://stackoverflow.com/questions/1568091/why-use-getters-and-setters –

答えて

4

「最善」の方法、すなわちプロパティ、C#言語の機能を使用することです:C#では

class Dog 
{ 
    public string Name {get;} // read-only property (can be set in constructor) 
    public string Breed {get;} 

    public Dog(string name, string breed) 
    { 
     this.Name = name; 
     this.Breed = breed; 
    } 
} 
+0

これはなぜdownvotedされたのか分かりませんが、C#4.6の後では '{get;}'の構文は正しいです(maaaaybe 4.5.1)。これにより、コンストラクタ内で設定されている読み取り専用プロパティになります。 – krillgar

+0

@krillgar C#4.6はありません。これはC#6(.NET 4.6などの異なる.NETフレームワークのバージョンをターゲットにすることができる)の時点で有効な構文です。確かに、新しいフレームワークのバージョンはしばしば新しいコンパイラと同時にリリースされるので、これらのバージョン番号は混乱する可能性があります。 – Kyle

+0

@Kyleええ、私の悪い。私はいくつかのことをやり遂げ、間違っているのです。訂正してくれてありがとう。 – krillgar

2

、我々はpropertiesと呼ばれる言語構造を持っている、と私は、彼らが最も適切だと思いますここに。通常、プロパティはオブジェクト状態を公開するために使用され、メソッドより優先され、読み込み専用または読み書き可能にすることができます。

class Dog 
{ 
    public string Name { get; private set; } 
    public string Breed { get; private set; } 

    public Dog(string name, string breed) 
    { 
     Name = name; 
     Breed = breed; 
    } 
} 

C#のプロパティには多くの味がありますので、ドキュメントでそれらを読み上げることをお勧めします。

1

一般的に、メソッドはアクションおよびプロパティを表し、データを表します。 この場合、プロパティの値がプロセスメモリに格納され、そのプロパティが値にアクセスできるようになるため、プロパティを使用します。

プロパティの値は、プロセスメモリに格納され、 プロパティが値だけへのアクセスを提供する場合、かなりの方法よりも、

  • をプロパティを使用。

以下の状況では、プロパティではなくメソッドを使用します。

  • 操作はフィールドセットよりも遅く、 となります。 の非同期バージョンをスレッドのブロックを避けるために提供することを検討している場合でも、 操作がプロパティであるには高価すぎる可能性が非常に高いです。特に、 の操作では、ネットワークまたはファイルシステムにアクセスする操作(初期化のために一度だけ 以外)がメソッドである可能性があります。 プロパティ。
  • 操作は、Object.ToStringメソッドなどの変換です。
  • オペレーションは呼び出されるたびに異なる結果を返します。パラメータが変更されない場合は、 となります。たとえば、NewGuidメソッド は、呼び出されるたびに異なる値を返します。
  • この操作には、重大かつ観察可能な副作用があります。内部キャッシュを移植する は、一般に、観察可能な副作用であると考えられています( )。
  • この操作では、内部状態のコピーが返されます( には、スタックに返された値型オブジェクトのコピーが含まれていません)。 操作は配列を返します。

コードサンプルの詳細については、この記事をお読みください。

Choosing Between Properties and Methods

+0

あなたがリンクした記事は本当に良いと思います –

+0

はい。それは本当に良い記事ですが、例を使って理由を説明しています。 – Sampath

+0

Infact、私はあなたの答えをupvoted –

0

あなたはフィールドをカプセル化するためのプロパティを使用することができます。

class Program 
    { 
     static void Main(string[] args) 
     { 
      Dog fuffy = new Dog("Fuffy", "Amarant"); 
      Console.WriteLine(fuffy.Name); 
      Console.WriteLine(fuffy.Breed); 
    } 
} 

class Dog 
{ 
    private string name; 
    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 
    private string breed; 
    public string Breed 
    { 
     get { return breed; } 
     set { breed = value; } 
    } 
    public Dog(string pName, string pBreed) 
    { 
     Breed = pBreed; 
     Name = pName; 
    } 
} 
0

私はそれらのいずれもが「最良」であると言うだろうが、私はC#のビルトインproperties使用します。

public string Breed {get;set;} 

あなたは品種ビーイングセットを防ぐために望んでいた場合、あなたはsetを削除することができます:

public string Breed {get;} 

この例では、getBreedは読み取り専用で、2番目の例と同じです。

はこのように見て、あなたのクラスを変更します。あなたはあなたの例でそれをやった

class Program 
{ 
    static void Main(string[] args) 
    { 
     Dog fuffy = new Dog("Fuffy", "Armant"); 
     Console.WriteLine(fuffy.breed); //Prints Fuffy 
     Console.WriteLine(fuffy.breed = "Muffy"); //Prints Muffy 
     Console.WriteLine(fuffy.breed_readonly = "Muffy"); //World ends in exception 
    } 
} 


class Dog 
{ 
    public string name {get;set;} 
    public string breed {get;set;} 

    public string name_readonly {get;} 
    public string breed_readonly {get;} 

    public Dog(string name, string breed) 
    { 
     this.name = name; 
     this.breed = breed; 

     this.name_readonly = name; 
     this.breed_readonly = breed; 
    } 
} 
関連する問題