【问题标题】:C# A variable that cannot be changed outside of function [closed]C#一个不能在函数之外改变的变量[关闭]
【发布时间】:2016-10-25 09:33:10
【问题描述】:

是否可以在被调用函数中声明一个变量,并且没有外部源可以更改该变量?例如:

private void SetVariable(){
    privatetypevariable variable = "hello";
}

variable = "world"; //<-- doesnt work because it cannot access the variable 'variable' inside SetVariable()

如何访问上述方法范围之外的变量?

【问题讨论】:

  • 不,这是不可能的。变量仅在相同的嵌套范围内可见。
  • 局部变量不能在方法外访问
  • 你需要正确掌握作用域和封装等概念
  • VB.Net等语言支持方法内的静态变量,但C#不支持blogs.msdn.microsoft.com/csharpfaq/2004/05/11/…
  • @LachlanMather 为了获得良好的起点,请在此处阅读 globallocal 范围:stackoverflow.com/questions/33108958/…Global = 类中的所有方法 (public void someMethod()) 都可以访问,local = 只能在方法的大括号之间使用 ({ })。

标签: c#


【解决方案1】:

与其在方法中声明变量,不如将其定义为类字段。然后,您可以从课堂内的任何地方更改它。字段通常标记为私有,因此不能在类外更改。如果您想在类之外公开它,请使用属性而不是公共类型。

private privatetype fielda;
void methodA(){
    fielda = "hello";
}

void someOtherMethod()
{
    fielda = fielda + " world"; 
}

【讨论】:

    【解决方案2】:

    这是不可能的,因为变量只存在于其给定范围内,一旦您退出范围,变量就会丢失。 除此之外,您不能将可见性修饰符添加到方法中声明的变量中

    下面的代码不起作用,因为 s 只存在于 methodA() 的范围内,并且在您退出范围后立即丢失。

    private void methodA(){
        String s = "hello";
    }
    
    private void methodB(){
        s = s + " world"; //even tho methodA created an s variable, it doesn't exist in the eyes of methodB
    }
    

    你可以这样做:

    class someClass{
        private String s;
    
        public someClass(){
            s = "hello world";
        }
    
        public String getVariable(){ //you can read this variable, but you can't set it outside of this class.
            return s; 
        }
    

    }

    【讨论】:

      【解决方案3】:

      如果在函数内指定变量,则在 C# 中它的作用域仅限于该函数。

      示例 1:

          private void foo(string bar)
          {
             string snark = "123";
          }
      
          private void derk()
          {
             snark = "456";
          }
      

      示例 1 会导致编译错误。如果您的意思是在类内部,请将属性声明为 readonly,并且不能在其初始构造函数之外进行更改。

      示例 2:

          public class Lassy
          {
             private readonly string _collarColour;
      
             public Lassy(string collarColour)
             {
                _collarColour = collarColour;
             }
      
             private void SetCollarColour(string newColour)
             {
                _collarColour = newColour;
             }
          }
      

      示例 2 也会导致编译错误,因为您无法在其初始构造函数之外的类中分配 readonly 属性。

      要实现您想要的,请使用readonly

      【讨论】:

        猜你喜欢
        • 2018-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-30
        • 2020-09-19
        • 1970-01-01
        • 1970-01-01
        • 2015-11-06
        相关资源
        最近更新 更多