C# 如何验证函数是否为<&燃气轮机;属性是否已初始化?
我的类有一个Func属性,如下所示C# 如何验证函数是否为<&燃气轮机;属性是否已初始化?,c#,.net,c#-4.0,C#,.net,C# 4.0,我的类有一个Func属性,如下所示 public class ClassA { public Func<string, IClassB> MyProperty { get; set; } } 对于常规属性,而不是Func返回类型,它可以按预期工作。ClassA clsA=new ClassA(); ClassA clsA = new ClassA(); if (clsA.MyProperty == null) Messa
public class ClassA {
public Func<string, IClassB> MyProperty { get; set; }
}
对于常规属性,而不是Func返回类型,它可以按预期工作。ClassA clsA=new ClassA();
ClassA clsA = new ClassA();
if (clsA.MyProperty == null)
MessageBox.Show("IsNull");
clsA.MyProperty = new Func<string, bool>(x => x.Equals("1"));
MessageBox.Show(clsA.MyProperty == null ? "IsNull" : "IsNotNull");
if(clsA.MyProperty==null)
MessageBox.Show(“IsNull”);
clsA.MyProperty=newfunc(x=>x.Equals(“1”);
Show(clsA.MyProperty==null?“IsNull”:“IsNotNull”);
如果我接受您的代码并执行此操作,则效果非常好
var a = new ClassA();
var initialized = a.MyProperty == null;
代码完全有效。因此,您的断言不正确,可以检查null
你想要实现什么,也许你想要什么
public class ClassA
{
private readonly Func<string, IClassB> myFunc;
public ClassA(Func<string, IClassB> myFunc)
{
this.myFunc = myFunc;
}
public IClassB MyFunc(string input)
{
if (this.myFunc = null)
{
return null;
}
return this.myFunc(input);
}
}
公共类ClassA
{
私有只读Func myFunc;
公共类别A(Func myFunc)
{
this.myFunc=myFunc;
}
公共IClassB MyFunc(字符串输入)
{
如果(this.myFunc=null)
{
返回null;
}
返回此.myFunc(输入);
}
}
您可以通过以下标准方式进行检查:
IClassB a = new IClassB();
//it is null now so Empty will follow
if (a.MyProperty == null) Console.WriteLine("Empty");
else Console.WriteLine("Not empty");
a.MyProperty = new Func<string, IClassB>((s)=>{ return new IClassB(); });
//it is not null now so Not empty will follow
if (a == null) Console.WriteLine("Empty");
else Console.WriteLine("Not empty");
IClassB a=新的IClassB();
//它现在为空,因此随后将为空
如果(a.MyProperty==null)Console.WriteLine(“空”);
else控制台。WriteLine(“非空”);
a、 MyProperty=new Func((s)=>{return new IClassB();});
//它现在不为空,因此后面将显示not empty
如果(a==null)Console.WriteLine(“空”);
else控制台。WriteLine(“非空”);
除了其他答案外,您可以使用函数的属性(如果您希望/可以在ClassA中测试此属性):
公共类ClassA{
私有财产;
公共函数MyProperty{
得到{
如果(myProperty==null)
返回一些默认行为;
归还我的财产;
}
集合{
myProperty=值;
}
}
在运行时,您可以检查属性是否已初始化。您不能检查的是它的调用返回的值,因为调用是动态的
class Program
{
interface IClassB { }
class ClassB1 : IClassB { }
class ClassB2 : IClassB { }
class ClassA
{
public Func<string, IClassB>
MyProperty { get; set; }
}
static void Main(string[] args)
{
var classA = new ClassA();
Console.WriteLine((classA.MyProperty == null)
? "Not initialized" : "Initialized");
classA.MyProperty = (a) =>
{
if (a == "1")
return new ClassB1();
else if (a == "2")
return new ClassB2();
else
return null;
};
Console.WriteLine((classA.MyProperty == null)
? "Not initialized" : "Initialized");
object
c1 = classA.MyProperty.Invoke("1"),
c2 = classA.MyProperty.Invoke("2"),
c3 = classA.MyProperty.Invoke("3");
Console.WriteLine((c1 != null) ? c1.GetType().Name : "null");
Console.WriteLine((c2 != null) ? c2.GetType().Name : "null");
Console.WriteLine((c3 != null) ? c3.GetType().Name : "null");
}
}
类程序
{
接口IClassB{}
类别B1:IClassB{}
类ClassB2:IClassB{}
甲级
{
公共职能
MyProperty{get;set;}
}
静态void Main(字符串[]参数)
{
var classA=新的classA();
Console.WriteLine((classA.MyProperty==null)
?“未初始化”:“已初始化”);
classA.MyProperty=(a)=>
{
如果(a=“1”)
返回新的ClassB1();
否则,如果(a==“2”)
返回新的ClassB2();
其他的
返回null;
};
Console.WriteLine((classA.MyProperty==null)
?“未初始化”:“已初始化”);
对象
c1=classA.MyProperty.Invoke(“1”),
c2=classA.MyProperty.Invoke(“2”),
c3=classA.MyProperty.Invoke(“3”);
Console.WriteLine((c1!=null)?c1.GetType().Name:“null”);
Console.WriteLine((c2!=null)?c2.GetType().Name:“null”);
Console.WriteLine((c3!=null)?c3.GetType().Name:“null”);
}
}
通过某种方式初始化,你是指源代码中的某个地方吗?嗯,有Roslyn…虽然,使用has was意味着在过去存在一个已更改的状态,因此是某种执行线程。请提供更多详细信息。为什么你不能简单地MyProperty==null
?为什么不可能检查MyProperty的null值?I如果MyProperty是一个事件,那么您是对的。您不能在类外进行检查!
public class ClassA {
private Func<string, IClassB> myProperty;
public Func<string, IClassB> MyProperty {
get {
if (myProperty == null)
return some default behaviour;
return myProperty;
}
set {
myProperty = value;
}
}
class Program
{
interface IClassB { }
class ClassB1 : IClassB { }
class ClassB2 : IClassB { }
class ClassA
{
public Func<string, IClassB>
MyProperty { get; set; }
}
static void Main(string[] args)
{
var classA = new ClassA();
Console.WriteLine((classA.MyProperty == null)
? "Not initialized" : "Initialized");
classA.MyProperty = (a) =>
{
if (a == "1")
return new ClassB1();
else if (a == "2")
return new ClassB2();
else
return null;
};
Console.WriteLine((classA.MyProperty == null)
? "Not initialized" : "Initialized");
object
c1 = classA.MyProperty.Invoke("1"),
c2 = classA.MyProperty.Invoke("2"),
c3 = classA.MyProperty.Invoke("3");
Console.WriteLine((c1 != null) ? c1.GetType().Name : "null");
Console.WriteLine((c2 != null) ? c2.GetType().Name : "null");
Console.WriteLine((c3 != null) ? c3.GetType().Name : "null");
}
}