C# 公共数据类型变量( get; 私有集) 如果变量已经是公共的,为什么我们需要 set 方法?



我是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上使常量变量一样。

相关内容

最新更新