当前位置: 首页 > 编程语言 > C#

为什么我只能从静态函数访问静态成员?分享

时间:2023-04-10 20:30:13 C#

为什么我只能从静态函数访问静态成员?我在一个类中有一个静态函数。每当我尝试使用非静态数据成员时,都会出现编译错误。非静态字段、方法或属性成员需要对象引用为什么会这样?非静态成员属于实例。如果不以某种方式解决您正在谈论的类的哪个实例,那是没有意义的。在静态上下文中,您没有实例,这就是为什么您不能在不显式提及对象引用的情况下访问非静态成员的原因。事实上,您可以通过显式指定对象引用来访问静态上下文中的非静态成员:classHelloWorld{inti;publicHelloWorld(inti){this.i=i;}publicstaticvoidPrint(HelloWorldinstance){Console.WriteLine(instance.i);}}vartest=newHelloWorld(1);vartest2=newHelloWorld(2);HelloWorld.打印(测试);如果在Print方法Shouldprint1insteadof2中没有对实例的显式引用,它怎么知道呢?实例方法取决于特定实例的状态才能运行。假设你有这个类,它有你描述的场景:classPerson{staticPrintName(){//不合法,但让我们说现在是这样。控制台.WriteLine(名称);}私人名字{得到;放;希望问题现在很明显。因为Name是一个实例成员,所以您需要该类的一个实际实例,因为Name可能因实例而异。所以静态方法(不附加到实例)不知道要使用哪个实例。您必须明确指定是哪一个。静态方法不能直接访问类的任何非静态成员变量。毕竟:即使类存在,也可以在没有类实例的情况下调用静态方法。您想如何访问不存在的实例上的成员变量?(当然,正如Mehrdad所指出的:您可以将类的实例传递给静态方法并访问该实例上的所有内容——但这不是您所说的,对吧?)静态函数只能使用静态成员,并且调用静态函数。如上所述,静态函数可以在类实例上运行,但不能在它们内部运行(因为缺少更具描述性的词)。例如:classMyClass{publicintx;公共静态整数y;publicstaticvoidTestFunc(){x=5;//无效,因为这里没有'this'上下文y=5;//有效,因为y不与对象实例相关联}publicstaticvoidTestFunc2(MyClassinstance){instance.x=5;//有效实例.y=5;//在C#中无效(在VB.NET中有效,但有警告)}}“不是”静态数据成员“的定义将是”实例数据成员“。换句话说,非静态成员属于你创建的实例类。静态方法不在该类的任何特定实例的上下文中运行。因此,当您要求此类方法使用非静态成员时,它不知道应该尝试该类的0个或多个实例中的哪一个从中获取数据。您不能从静态函数访问非静态数据。这是因为无论是否存在该类的任何实例化对象,都可以调用静态函数。但是,非静态数据依赖于特定对象(实例化)classes.由于无法确定在调用静态函数时是否实例化了任何对象,因此从中访问非静态数据是不合逻辑的(因此是不允许的)。这个问题在SO上以不同的形式/不同的语言被问过很多次:以上是C#学习教程:WhycanIonlyaccessstaticmembersfromstaticfunctions?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: