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

C# 有没有一种方法可以为C中的不同类和函数设置一个可访问的变量?,c#,visual-studio-2010,class,function,variables,C#,Visual Studio 2010,Class,Function,Variables,我正在VisualStudio2010中使用C创建一个项目 我在不同的文件class1.cs class2.cs class3.cs中有我的主程序.cs和几个不同的类,每个类都有自己的函数 我想知道是否有办法在program.cs中设置一个可以从每个不同类文件访问的变量 为了减少混淆,我将在示例中进行解释 program.cs用于创建文件。每个类将创建不同类型的文件txt、xml、xls等。我想指定在program.cs中保存文件的路径,因此如果我想更改路径,我只需在一个位置更改它 我想设置一个

我正在VisualStudio2010中使用C创建一个项目

我在不同的文件class1.cs class2.cs class3.cs中有我的主程序.cs和几个不同的类,每个类都有自己的函数

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

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

program.cs用于创建文件。每个类将创建不同类型的文件txt、xml、xls等。我想指定在program.cs中保存文件的路径,因此如果我想更改路径,我只需在一个位置更改它

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

有什么方法可以这样做吗?

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

class1.cs : MainClass

class1.cs : MainClass

class1.cs : MainClass
现在在MainClass中创建一个访问类型受保护的变量,如:

对于您的情况,最好将其设置为静态:


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

static class Program
{
     public static string Path
        {
            get { return path; }
            set { path = value; }
        }
     static string path = string.Empty;
}
因此,您可以使用Program.Path访问路径。您可以这样做。 program.cs是静态的,您可以从同一项目中的所有类访问它。 您可以在program.cs中声明一个静态只读属性,并且您的所有类都可以将该属性称为program。[yourproperty]。

您正在查找一个属性或字段:

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

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

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


希望这有帮助。

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

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

然后在代码中可以说AppSettings.GlobalFilePath=@C:\where

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

右键单击您的项目 选择属性 选择“设置”选项卡,根据需要创建文件 键入设置的名称,即PathToExport 选择类型字符串、范围应用程序并键入您的首字母 配置路径 现在,您可以使用

string path = Properties.Settings.Default.PathToExport;

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

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

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
作为一个选项,您可以使用示例:

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


尽可能避免静态字段、属性或全局状态的其他变体,例如设置。现在的全局状态越多,以后就越头疼。

您可以在程序类中设置公共静态变量,然后在其他类中添加对它的引用@SORA0419检查您是否可以创建一个保存该数据的单例类,或者使用一个配置文件。@LionelD您为什么这么认为?这完全取决于类层次结构的设计者来决定在他的情况下什么是好的选择;他没有告诉我们足够的信息来做出明智的决定。为什么-1???他问了一个解决问题的办法。这不是最好的,但仍然是问题的正确答案。这将导致他的代码高度耦合。您应该考虑使用接口将数据+ 1传递给您的答案,因为它确实比使用常量更好,我只是习惯于使用未分发的应用程序。不过,你会被我炒鱿鱼,这不是争论。@Stijn不要把它当成个人的事。这是一套规则,当你开始在某些地方工作的第一天你就学会了,然后它们就变成了第二张皮。有时他们是普遍正确的有时他们是正确的商店,有时他们只是垃圾。再见,所以:-@Stijn刚刚注意到你已经删除了你的答案。为什么?这在形式上是正确的。只需添加一些关于常数使用的警告,这仍然是一个好方法answer@Steve谢谢你的回复。在选择属性步骤之后,我有点迷路了。你去哪个选项卡输入设置?@Steve别担心,我不是针对个人:删除了我的答案,因为我认为保留一个低于标准的答案是没有用的,而你的包括关于使用常量的警告。
string path = Properties.Settings.Default.PathToExport;
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
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);
}