如果我们的项目中还有一个静态类,那么哪个静态类首先初始化?
例如:下面的代码给出了null异常.
class Program
{
static void Main(string[] args)
{
First.Write();
Second.Write();
}
}
static class First
{
public static int[] firstArray = new int[20];
public static int[] secondArray = Second.secondArray;
public static void Write()
{
Console.WriteLine(firstArray.ToString());
Console.WriteLine(secondArray.ToString());
}
}
static class Second
{
public static int[] firstArray = First.firstArray;
public static int[] secondArray = new int[30];
public static void Write()
{
Console.WriteLine(firstArray.ToString());
Console.WriteLine(secondArray.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
如果你注意,你会看到如果First类将自己初始化,那么secondArrayfield Second将为null.但是如果Second类首先初始化,那么Secondclass firstArray将为null.我试图告诉哪个初始化首先产生不同的结果.
我认为这是关于我的项目的抽象问题.我在试图理解为什么会得到意想不到的结果时遇到它.
我曾经读过静态类非常困难,甚至无法调试.这是真的吗?为什么?
如果一个例子有帮助,这里有一个PHP我用来访问数据库的类(我不认为这是一个特定于PHP的问题):
<?php
class DB
{
private static $instance;
private function __construct() { }
public static function getInstance()
{
if(!self::$instance)
{
self::$instance = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_NAME . ';', DB_USER, DB_PASS);
}
return self::$instance;
}
public static function getPreparedStatement($query)
{
$db = self::getInstance();
return $db->prepare($query);
}
public static function query($query)
{
$stmt = self::getPreparedStatement($query);
$stmt->execute();
}
public static function getResult($query)
{
$stmt = self::getPreparedStatement($query);
$stmt->execute();
return $stmt;
}
public static function getSingleRow($query)
{
$stmt …Run Code Online (Sandbox Code Playgroud) 为什么抽象类不能密封或静态?我也对此问题感到困惑为什么在C#中将静态类声明为密封和抽象?
我正在使用Google Mock,并且正在努力模拟C ++系统调用(特别是C ++ 11计时函数)。
我知道我应该创建一个接口,创建一个类以为我的实际实现实现该接口,然后在测试中模拟出该接口。我正在尝试编写一个嵌入式应用程序,所以这种间接听起来对我来说太昂贵了。
将系统调用并入Google Mock的最有效/最有效的方法是什么?
是否有可能在应用程序启动时"自动"初始化静态类?我自动意思是不需要引用属性.
我希望能够做到这一点的原因是我想在启动时自动设置应用程序的主题.
这是一个简短的片段:
static class Settings{
private static Theme _defaultTheme;
public static Theme DefaultTheme{
get{
return _defaultTheme;
}
private set{
_defaultTheme = value;
ThemeManager.SetTheme(value);
}
}
static Settings(){
DefaultTheme = Themes.SomeTheme;
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以(现在就是这样)和原来的getter/setter一起去打电话
ThemeManager.SetTheme( Settings.DefaultTheme );
Run Code Online (Sandbox Code Playgroud)
在App的构造函数(它是WPF项目)中它会完成这项工作,但是,至少从我的观点来看(如果我错了请纠正我),更适合默认主题应用而不是需要明确说明它.
c# static-constructor static-classes static-initialization static-class
我有以下类结构:
public abstract class PresenterBase
{
public static Dictionary<string, MethodInfo> methodsList;
public void Bind()
public void Initialize();
}
public class DevicePresenter: PresenterBase
{
public void ShowScreen();
public void HandleEvents();
}
public class HomePresenter: PresenterBase
{
public void ShowScreen();
public void HandleEvents();
}
Run Code Online (Sandbox Code Playgroud)
我希望HomePresenter和DevicePresenter具有在PresenterBase中定义的methodsList静态成员的单独副本.
不幸的是,他们与上述实现共享相同的副本.
它们是替代方法,我可以为HomePresenter和DevicePresenter单独复制methodsList吗?我不愿意在派生类中定义methodsList,因为将来如果有人添加另一个派生类,他必须记住将methodsList添加到该类.
我正在看一个项目,我发现了一些非常好奇的东西.
有一个静态类,它有一组方法,每个方法都调用一个远程服务器.
该模板看起来像这样:
public static class DAI
public static ResponseObject ExecStatement(string db, string sql)
{
{ ... }
}
public static DataSetResponseObject GetDataSet(string db, string sql)
{
{ ... }
}
public static DataTableResponseObject GetDataTable(string db, string sql)
{
{ ... }
}
}
Run Code Online (Sandbox Code Playgroud)
但是项目中的任何地方都没有调用此类.相反,它调用非静态类容器.
public class ExecSP : IExecSP
{
string _db;
public ExecSP(string db)
{
_db = db;
}
public ResponseObject OutputAsResponseObject(string sql)
{
return DAI.ExecStatement(_db, sql);
}
public ResponseObject OutputAsDataSet(string sql)
{
return DAI.GetDataSet(_db, sql);
}
public …Run Code Online (Sandbox Code Playgroud) 我最近开始学习C#,我对某些事感到困惑.静态类的文档告诉我它们只能包含静态成员.然而,我可以在我的静态类中定义非静态嵌套类和结构.
我猜测类/结构定义不算作成员,但为什么允许这样做?如果可以实例化静态类的嵌套类,那是否与静态类相矛盾?我在这里误解了一些明显的东西吗?
Azure 函数中的构造函数注入和自定义遥测事件的集合需要此非静态类。
如果我们在 Visual Studio 中创建一个 azure 函数应用程序,它会使用 static 关键字创建默认值,如下所示:
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
telemetryClient.TrackEvent(new Exception("Function started"));
}
Run Code Online (Sandbox Code Playgroud)
但是要使用构造函数依赖注入(对于 Temeltry 客户端,我正在使用它),我们需要删除 static 关键字。
public Function1(TelemetryClient telemetryClient)
{
_telemetryClient = telemetryClient;
}
Run Code Online (Sandbox Code Playgroud) 有没有办法在 ASP Core 的静态类中使用“IWebHostEnvironment”?
我的课 :
public class MainHelper
{
private readonly IWebHostEnvironment _hostingEnvironment;
public MainHelper(IWebHostEnvironment hostingEnvironment)
{
_hostingEnvironment = hostingEnvironment;
}
public static void SaveFile(IFormFile file)
{
var path = Path.Combine(_hostingEnvironment.WebRootPath, "uploads");
if (!Directory.Exists(path))
Directory.CreateDirectory(path);
using (var fileStream = System.IO.File.Create(Path.Combine(path, file.FileName)))
{
file.CopyTo(fileStream);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的行有错误:
var path = Path.Combine(_hostingEnvironment.WebRootPath, "uploads");
Run Code Online (Sandbox Code Playgroud)
错误: c# 会话非静态字段方法或属性“MainHelper._hostingEnvironment”需要对象引用
请指教
static-classes ×10
c# ×7
.net ×2
.net-core ×1
azure ×1
c++ ×1
class ×1
googlemock ×1
interface ×1
oop ×1
sealed ×1
static ×1
static-class ×1
unit-testing ×1