这些代码在C#中是否安全存储在内存中?

3

我有一个关于下面代码的问题。

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

然而,在学生类中,“courses”只被定义而没有声明。如果在学生类的构造函数中将参数设置为常量,这些代码是否安全?感谢您的帮助! :)

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

我认为你应该编辑一下你的问题,因为我不知道你想问什么?你是想问是否可以将数组作为参数传递吗? - Filip Cordas
1个回答

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

现在人们无法更改属性,因为setter是私有的。
另外,为了遵循.NET命名约定,请不要在参数名称中使用下划线,并对属性名称使用Pascal Notation。我已经删除了下划线,并对属性名称使用了Pascal Notation。
编辑:
@diemaus在此答案的评论中提到了一个好点子,在C#6中:
你实际上可以完全移除private set,只留下{ get; }。只要在构造函数中设置属性就可以。

3
只保留{ get; }并完全删除private set是可以的,只要你在构造函数中设置属性即可。 - mausworks
@diemaus 哇,我不得不承认,在使用C#进行多年开发后,我竟然不知道这是允许的。感谢您的提示:非常有用。 - CodingYoshi
@FilipCordas 没有说要删除 get,而是要删除 set。并且它不能从外部改变。 - CodingYoshi
正如@FilipCordas所指出的那样。这是C# 6的一个特性,在低版本中不起作用。实际上,版本6包含了许多有用的语言特性,请查看!我还应该指出this关键字也是多余的吗?或者这只是你的编程风格? - mausworks
谢谢你的帮助!说实话,我没想到我的代码会有这么多小问题,你的评论真的帮了我很多!非常感谢 :) - Hz Shang
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接