[英]C# ASP.NET - a variable that's accessible from any function, and is different to any user?
[英]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'变量传递给函数。
有办法吗?
通过主项目的设置属性编辑器添加新设置,可以解决此类问题(执行应用程序时需要的只读值)。
现在,您可以使用类中的任何位置访问此值
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
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.