繁体   English   中英

有没有办法在C#中为不同的类和函数设置可访问的变量?

[英]Is there a way to set a variable accessible for different class and function in C#?

我正在使用C#在Visual Studio 2010中创建一个项目。

我有我的main( program.cs )和不同文件中的几个不同的类( class1.cs class2.cs class3.cs ),每个类都有自己的函数。

我想知道是否有办法设置一个可以从每个不同的类文件访问的变量(比如在program.cs )?

为了减少混淆,我将在示例中解释。

program.cs用于创建文件。 每个类都要创建不同类型的文件(txt,xml,xls等)。 我想指定在program.cs保存文件的路径,所以如果我想更改路径,我只需要在一个地方更改它。

我想设置一个可以从每个类文件访问的变量,而不是将'path'变量传递给函数。

有办法吗?

通过主项目的设置属性编辑器添加新设置,可以解决此类问题(执行应用程序时需要的只读值)。

  • 右键单击您的项目
  • 选择属性
  • 选择“设置”选项卡(如果需要,创建文件)
  • 输入设置的名称(IE PathToExport)
  • 选择Type String,Scope Application并键入初始配置路径

现在,您可以使用类中的任何位置访问此值

string path = Properties.Settings.Default.PathToExport;

当然,总是可以在类中定义静态属性并读取该值,但是在程序的可执行文件中编写固定路径是一个非常糟糕的主意。 如果要更改它,则需要重新编译并重新分发应用程序。 使用exe.config文件可以更清晰地分离代码与配置。 (并将路径更改为闪亮的新服务器位置需要仅修改exe.config文件)

您可以使用公共静态属性执行此操作。

static class Program
{
     public static string Path
        {
            get { return path; }
            set { path = value; }
        }
     static string path = string.Empty;
}

因此,您可以使用Program.Path访问Path

您正在寻找static属性或字段:

public class Program
{
    public static string TargetDirectory = @"C:\MyDirectory";
}

public class SomeOtherClass
{
    public void SomeMethod()
    {
        var directory = Program.TargetDirectory;
    }
}

创建一个类,例如MainClass ,并从该类派生所有三个类。

class1.cs : MainClass

class1.cs : MainClass

class1.cs : MainClass

现在在MainClass创建一个变量,访问类型protected如:

protected string path = "what ever you path";

对于您的情况,最好将其设为static

protected static string path = "what ever you path";

你可以这样做。
program.cs是静态的,您可以从同一项目中的所有类访问它。
您可以在program.cs中声明一个静态只读属性,所有类都可以将该属性称为程序。[yourproperty]。

您可以在program.cs文件或另一个文件中创建一个constante变量,也可以创建一个返回字符串的静态字段或静态属性。

希望这可以帮助。

您可以创建一个静态变量,因为可以从代码中的任何位置访问这些变量。 您很可能希望将其包装在静态服务类中,例如下面的...

public static class AppSettings
{
  public static string GlobalFilePath {get; set;}
}

然后在你的代码中你可以说AppSettings.GlobalFilePath = @“C:\\ Wherever”

你的课程应该以某种方式相关:

class Program
{
    public string PathForSavingFiles { get; set; }
}

abstract class FileBase
{
    private readonly Program program;

    protected FileBase(Program program)
    {
        this.program = program;   
    }

    public void Save()
    {
        Save(program.PathForSavingFiles);
    }

    protected abstract void Save(string path);
}

class TxtFile : FileBase { ... }
class XlsxFile : FileBase { ... }
// etc

作为选项,您可以使用依赖注入MEF示例):

interface IInfrastructureProvider
{
    string PathForSavingFiles { get; }
}

class Program : IInfrastructureProvider
{
    public string PathForSavingFiles { get; set; }
}

abstract class FileBase
{
    private readonly IInfrastructureProvider provider;

    [ImportingConstructor]
    protected FileBase(IInfrastructureProvider provider)
    {
        this.provider = provider;   
    }

    public void Save()
    {
        Save(provider.PathForSavingFiles);
    }

    protected abstract void Save(string path);
}

这允许您模拟IInfrastructureProvider进行测试,并保持组件松散耦合。

如果可能,请避免使用静态字段,属性或全局状态的其他变体(例如设置)。 你现在拥有的全球状态越多,你以后就会越头痛。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM