2017-02-19 15 views
3

次のコードについて質問があります。これらのコードはC#でメモリ内で安全ですか?

まず、これらのコードはうまく機能しました。

しかし、Studentクラスの "courses"についてのみ定義された宣言はありません。Constructor of Studentの引数が定数である場合、これらのコードは安全ですか?助けるため 感謝!:)

public class Student 
{ 
    public string name; 
    public int age; 
    public string[] courses; 
    public Student(string _name, int _age,params string[] _courses) 
    { 
     name = _name; 
     age = _age; 

     courses = _courses;//is this OK if _courses is constant? 


    } 
} 
public class work : MonoBehaviour 
{ 
    void Start() 
    { 
     /* 
     string[] courses={"math", "English"}; 
     Student Tom = new Student("Tom",18,courses); 
     //It's wrong! 
     */ 
     Student Tom = new Student("Tom", 18, "math", "English"); 
     string Tom_text = JsonUtility.ToJson(Tom); 
     Debug.Log(Tom_text); 
    } 
} 
+0

質問を編集する必要があると思いますが、何を聞きたいのですか? params引数として配列を渡すのがよいかどうか尋ねたいですか? –

答えて

5

あなたがそれを持っている方法は、誰もがいつでもStudentオブジェクトを変更することができます。

それが作成されたら、あなたはそれのような不変行い、その後、誰もがStudentオブジェクトについては何も変更したくない場合は、次のセッターがプライベートであるため、

public class Student 
{ 
    public string Name { get; private set; } 
    public int Age { get; private set; } 
    public IEnumerable<string> Courses { get; private set; } 
    public Student(string name, int age, params string[] courses) 
    { 
     this.Name = name; 
     this.Age = age; 

     this.Courses = courses; 
    } 
} 

今、人々は、プロパティを変更することはできません。

.NET命名規則に従うには、パラメータ名に-アンダースコアを使用せず、プロパティ名にはパスカル表記を使用します。私はアンダースコアを削除し、プロパティ名のためにパスカル表記を使用しました。

EDIT

@diemausは、C#6で、この回答へのコメントで良い点を述べた:

は、あなたが実際に完全にプライベートなセットを削除し、ちょうどそれ{ get; }を残すことができます。これは、コンストラクタでプロパティを設定している間だけ許可されます。

+3

実際に 'private set'を完全に削除して、' {get; } '。これは、コンストラクタでプロパティを設定している間だけ許可されます。 –

+0

@diemausうわー私は、C#で何年もの開発を経て、許されているとは思っていませんでした。このヒントをありがとう:非常に便利です。 – CodingYoshi

+0

C#6でのみ。ニックピックではありませんが、あなたのコードは本当に不変ではありません。 getを省略すると、読み取り専用フィールドが作成されます。このフィールドでは、フィールドは読み取り専用ではなく、変更することができます。 。また、6で 'public string Name {get;セット; } = "asd";実際には関係ないけど本当に涼しい –

関連する問題