cSt*_*off 65 .net c# resharper
我有以下代码片段:
Expression<Func<TSource, TDest>> expression = model => new TDest{};
// Result: {model => new TestModel(){}}
Run Code Online (Sandbox Code Playgroud)
ReSharper使用以下RedundantEmptyObjectOrCollectionInitializer设置重构此代码段:
Expression<Func<TSource, TDest>> expression2 = model => new TDest();
// Result: {model => new TestModel()}
Run Code Online (Sandbox Code Playgroud)
在那之后,我的代码不起作用.花括号对初始化有什么影响?
我发现C#和C#之间new object()new {}有什么区别?在Stack Overflow上,但两个实例看起来都相同.
expression.GetType().ToString() 等于
expression2.GetType().ToString()
表达式树中这些初始化之间有什么区别?:
var a = model => new TDest{};
var b = model => new TDest();
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 104
在常规的原始C#中,答案是"没有".但是,当涉及表达式树时,存在差异; 在这里可以看到
using System;
using System.Linq.Expressions;
public class C<TSource, TDest> where TDest : new() {
public Expression<Func<TSource, TDest>> Foo() => model => new TDest();
public Expression<Func<TSource, TDest>> Bar() => model => new TDest {};
}
Run Code Online (Sandbox Code Playgroud)
编译为:
public Expression<Func<TSource, TDest>> Foo()
{
ParameterExpression parameterExpression = Expression.Parameter(typeof(TSource), "model");
Expression arg_2E_0 = Expression.New(typeof(TDest));
ParameterExpression[] expr_2A = new ParameterExpression[1];
expr_2A[0] = parameterExpression;
return Expression.Lambda<Func<TSource, TDest>>(arg_2E_0, expr_2A);
}
public Expression<Func<TSource, TDest>> Bar()
{
ParameterExpression parameterExpression = Expression.Parameter(typeof(TSource), "model");
Expression arg_38_0 = Expression.MemberInit(Expression.New(typeof(TDest)), Array.Empty<MemberBinding>());
ParameterExpression[] expr_34 = new ParameterExpression[1];
expr_34[0] = parameterExpression;
return Expression.Lambda<Func<TSource, TDest>>(arg_38_0, expr_34);
}
Run Code Online (Sandbox Code Playgroud)
因此,除了之外,其中一个涉及Expression.MemberInit(带有一组空MemberBinding元素)Expression.New.这可能会扰乱任何不期望它的LINQ提供程序(或任何类似的表达式树分析).
ReSharper正在为您提供有关如何实例化TDest该类的更好建议.
理论上,两者没有任何区别,new TDest ()并且new TDest {}会为您提供一个实例TDest.
但是,当您使用初始化表达式时,这是因为您要设置公共属性或字段的值TDest.
class TDest
{
public string MyProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
因此,您可以初始化将TDest值设置为的类MyProperty.例如:
// Sample 1
new TDest { MyProperty = "This is the value of my property" };
// Sample 2
new TDest() { MyProperty = "This is the value of my property" };
Run Code Online (Sandbox Code Playgroud)
在你的情况下,你的类有一个无参数的构造函数,所以标点符号{, }或运算符()都可以.
对于具有无参数构造函数的简单方案,您只能使用TDest()简短形式.
但是如果你有以下课程.
class TDest
{
readonly ISomeInterface _someService;
public string MyProperty { get; set; }
public TDest(ISomeInterface someService)
{
_someService = someService;
}
}
Run Code Online (Sandbox Code Playgroud)
并且您希望MyProperty使用某些内容而不是其默认初始化值(null,引用类型)进行初始化,您可以使用完整对象初始化.例如:
// Sample 3
new TDest(new MySomeServiceImplementation()) { MyProperty = "This is the value of my property" };
Run Code Online (Sandbox Code Playgroud)
希望它有所帮助!
为了有更好的想法,去看看C#Object Initializers.
| 归档时间: |
|
| 查看次数: |
4790 次 |
| 最近记录: |