3

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

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

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

为了减少混淆,我将举例说明。

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

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

有没有办法这样做?

4

8 回答 8

5

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

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

现在你可以在你的类中的任何地方使用这个值了

string path = Properties.Settings.Default.PathToExport;

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

于 2013-06-18T15:43:27.727 回答
1

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

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

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

于 2013-06-18T15:41:32.963 回答
1

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

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

public class SomeOtherClass
{
    public void SomeMethod()
    {
        var directory = Program.TargetDirectory;
    }
}
于 2013-06-18T15:41:56.520 回答
0

创建一个类 eg 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";
于 2013-06-18T15:40:21.087 回答
0

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

于 2013-06-18T15:41:38.220 回答
0

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

希望这可以帮助。

于 2013-06-18T15:41:58.157 回答
0

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

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

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

于 2013-06-18T15:42:12.613 回答
0

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

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出于测试目的进行模拟,并使您的组件保持松散耦合。

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

于 2013-06-18T15:52:31.330 回答