我正在使用C#在Visual Studio 2010中创建一个项目。
我有我的主要文件(program.cs
)和不同文件中的几个不同的类(class1.cs
class2.cs
class3.cs
),每个类都有自己的函数。
我想知道是否有办法设置一个可以从每个不同的类文件访问的变量(比如在program.cs
中)?
为了减少混淆,我将在示例中解释。
program.cs是创建文件。每个类都要创建不同类型的文件(txt,xml,xls等)。我想在program.cs
中指定保存文件的路径,所以如果我想更改路径,我只需要在一个地方更改它。
我想设置一个可以从每个类文件访问的变量,而不是将'path'变量传递给函数。
有办法吗?
答案 0 :(得分:4)
通过主项目的设置属性编辑器添加新设置,可以解决此类问题(执行应用程序时需要的只读值)。
现在,您可以使用
从类中的任何位置访问此值string path = Properties.Settings.Default.PathToExport;
当然,总是可以在类中定义静态属性并读取该值,但是在程序的可执行文件中编写固定路径是一个非常糟糕的主意。如果要更改它,则需要重新编译并重新分发应用程序。使用exe.config文件可以更清晰地分离代码与配置。 (并且将路径更改为闪亮的新服务器位置需要仅修改exe.config文件)
答案 1 :(得分:1)
您可以使用公共静态属性执行此操作。
static class Program
{
public static string Path
{
get { return path; }
set { path = value; }
}
static string path = string.Empty;
}
因此,您可以使用Program.Path访问Path
答案 2 :(得分:1)
您正在寻找static
属性或字段:
public class Program
{
public static string TargetDirectory = @"C:\MyDirectory";
}
public class SomeOtherClass
{
public void SomeMethod()
{
var directory = Program.TargetDirectory;
}
}
答案 3 :(得分:0)
上课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";
答案 4 :(得分:0)
你可以这样做 program.cs是静态的,您可以从同一项目中的所有类访问它 您可以在program.cs中声明一个静态只读属性,并且所有类都可以将该属性作为程序调用。[yourproperty]。
答案 5 :(得分:0)
你可以在program.cs文件或另一个文件中创建一个constante变量,或者你可以创建一个静态字段或一个返回你的字符串的静态属性。
希望这有帮助。
答案 6 :(得分:0)
您可以创建静态变量,因为可以从代码中的任何位置访问这些变量。您很可能希望将其包装在静态服务类中,例如下面的......
public static class AppSettings
{
public static string GlobalFilePath {get; set;}
}
然后在你的代码中你可以说AppSettings.GlobalFilePath = @“C:\ Wherever”
答案 7 :(得分: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
作为选项,您可以使用dependency injection(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
以进行测试,并使组件松散耦合。
如果可能,请避免使用静态字段,属性或全局状态的其他变体(例如设置)。你现在拥有的全球状态越多,你以后就会越头疼。