这些代码在c#的内存中是否安全?

时间:2017-02-19 16:09:26

标签: c# unity3d

我对以下代码有疑问。

首先,这些代码运作良好。

但是,没有关于Student类中“课程”的声明。如果在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);
    }
}

1 个答案:

答案 0 :(得分:5)

您拥有它的方式,任何人都可以随时更改Student对象。

如果您不希望任何人在创建Student对象后对其进行任何更改,请将其设为 immutable ,如下所示:

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;
    }
}

现在人们无法更改属性,因为setter是私有的。

要遵循.NET命名约定,请不要在参数名称中使用-下划线,并使用 Pascal Notation 作为属性名称。我删除了下划线,并使用 Pascal Notation 作为属性名称。

修改

@diemaus在C#6的评论中提到了一个很好的观点:

  

您实际上可以完全删除私有集,只需将其保留{ get; }即可。只要您只在构造函数中设置属性,就允许这样做。