有没有一种方法可以在c#中为不同的类和函数设置一个可访问的变量?

本文关键字:函数 设置 访问 变量 一个 方法 一种 有没有 | 更新日期: 2023-09-27 18:18:50

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

我有我的主(program.cs)和几个不同的类在不同的文件(class1.cs class2.cs class3.cs),每个类有自己的功能。

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

为了避免混淆,我将举例说明。

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

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

有办法吗?

有没有一种方法可以在c#中为不同的类和函数设置一个可访问的变量?

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

    右键单击你的项目
  • 选择Settings选项卡(如果需要创建文件)
  • 输入您的设置名称(例如PathToExport)
  • 选择类型字符串,范围应用并键入您的初始值配置路径

现在您可以使用

从类中的任何地方访问该值
string path = Properties.Settings.Default.PathToExport;
当然,在一个类中定义一个静态属性并读取它的值是可能的,但是在一个程序的可执行文件中写一个固定的路径是一个非常糟糕的主意。如果要更改它,则需要重新编译和重新分发应用程序。使用exe。配置文件,您可以更清晰地将代码与配置分离。(将路径更改到一个闪亮的新服务器位置只需要修改exe。配置文件)

可以使用公共静态属性来实现。

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

所以你可以用Program访问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";

你可以这么做。
cs是静态的,您可以从同一项目中的所有类访问它。
你可以在program.cs中声明一个静态只读属性,并且你所有的类都可以像program.[yourproperty].

那样调用这个属性。

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

您可以创建一个静态变量,因为这些变量可以从代码中的任何地方访问。最有可能的是,你想把它包装在一个静态服务类中,如下所示:

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

那么在你的代码中你可以说AppSettings。GlobalFilePath = @"C:' anywhere "

您的类应该以某种方式相关:

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用于测试目的,并保持组件松散耦合。

如果可能的话,避免静态字段,属性或全局状态的其他变体(例如设置)。您现在拥有的全局状态越多,以后遇到的麻烦就越多。