我是C#的新手。我以前用Java编码过。在 Java 中,实例变量是私有的,因此没有人直接访问它们,我们有公共 getter 和 setter 来访问它们。但是在 C# 中,如果变量本身不是公共的,那么我们就不能有public set
方法。 如果变量本身是公共的并且我们可以直接访问它,那么首先需要 set 方法吗?
您以错误的方式将 Java 概念映射到 C# 概念上。
首先,请注意,在 C# 中,您还可以像在 Java 中一样编写代码,使用 getter 和 setter 方法以及私有字段。就编译器而言,此 C# 代码完全没问题:
private int foo;
public int getFoo() {
return foo;
}
public void setFoo(int foo) {
this.foo = foo;
}
但您可能会被其他 C# 开发人员皱眉。
您在问题中似乎在谈论的是(自动实现的(属性。它们基本上是这种"私人领域+getter + setter"模式的句法糖。当您执行以下操作时:
public int Foo { get; set; }
自动生成一个私人字段、一个二传手和一个吸气手。但是,您无法直接访问此字段。您可以通过执行Foo = ...
来调用二传手,并通过以任何方式访问Foo
的值来调用getter。
属性的访问修饰符指示 getter 和 setter 的访问修饰符,而基础字段将始终是私有的。因此,对于上面的Foo
属性,它的getter和setter都是公共的。
现在,如果我想要不同的访问修饰符来获取和设置器怎么办?我可以这样做:
public int Foo { get; private set; }
现在,getter 是公共的,但 setter 是私有的。现在,Java 开发人员可能会问"为什么我需要私有资源库?"因为在 Java 中,您可以直接设置字段。但在这里,由于该字段是自动生成的并且程序员无法访问,因此私有二传手并非毫无意义。
现在你应该明白为什么这是不允许的:
private int Foo { get; public set; }
这意味着 getter 是私有的,但 setter 是公共的,这意味着该属性可以在代码库中的任何位置设置,但只能从同一类中读取。 奇怪的领域,不是吗?
如果变量本身是公共的并且我们可以直接访问它,那么首先需要 set 方法吗?
正如我所说,如果你只有一个getter,那么属性甚至不能在同一类中设置(构造函数除外(,不像在Java中,你可以直接设置底层字段。
在Java中:
private int _age = 0;
public int getAge(){
return _age;
}
public void setAge(int value){
_age = value;
}
在 C# 中:
private int _age = 0;
public int Age{
get {
return _age;
}
set{
_age = value;
}
}
你不觉得或多或少是同样的事情吗?恕我直言,C# 更简洁。其他细微区别:属性与 IntelliSense 中的方法具有不同的图标,在"调用"它们时不使用括号,它们只接受一个值(以设置的形式(
我想课程的马;如果你想使用它,Java形式在c#中是合法的,尽管C#形式在Java中不可用。通常,C# 用户广泛使用属性,因为现代 C# 允许我们将支持变量隐藏在一些语法糖后面:
public int Age{ get; set; }
在这种形式中,您根本不使用支持变量,而只使用公共名称,无论您是在类内部还是外部
-
你的问题的其余部分是基于一个误解,所以它不能真正得到回答;正如你在上面看到的,私有变量是由公共属性访问的。我们在 c# 中并不真正使用公共变量,只使用公共属性。关于属性、私有获取和设置、只读等还有很多话要说,但这更像是精细手册的工作
方法 "get" = 用于设置访问以获取变量的值。 方法 "set" = 用于对变量修改的集合访问
C#为开发人员提供了使变量只获取一个值,就像我们在java上使常量变量一样。