c# - resharper中文 - resharper教學
C#中表達式中的新Object()和新Object{}之間有什麼區別? (2)
我有以下代碼片段:
Expression<Func<TSource, TDest>> expression = model => new TDest{};
// Result: {model => new TestModel(){}}
ReSharper使用
RedundantEmptyObjectOrCollectionInitializer
設置重構此代碼段:
Expression<Func<TSource, TDest>> expression2 = model => new TDest();
// Result: {model => new TestModel()}
在那之後,我的代碼不起作用。
花括號對初始化有什麼影響?
我發現
C#中
new object()
和
new {}
之間
有
什麼區別?
在Stack Overflow上,但兩個實例看起來都相同。
expression.GetType().ToString()
等於
expression2.GetType().ToString()
表達式樹中這些初始化之間有什麼區別?:
var a = model => new TDest{};
var b = model => new TDest();
ReSharper為您提供了有關如何實例化
TDest
類的更好建議。
理論上,沒有任何區別,因為
new TDest ()
和
new TDest {}
將為您提供
TDest
的實例。
但是,當您使用初始化表達式時,這是因為您要在
TDest
設置公共屬性或字段的
TDest
。
class TDest
{
public string MyProperty { get; set; }
}
因此,您可以初始化
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" };
在你的情況下,你的類有一個無參數的構造函數,所以標點符號
{, }
或運算符
()
都可以。
對於具有無參數構造函數的簡單場景,您只能使用
TDest()
簡短形式。
但是如果你有以下課程。
class TDest
{
readonly ISomeInterface _someService;
public string MyProperty { get; set; }
public TDest(ISomeInterface someService)
{
_someService = someService;
}
}
並且您希望使用某些東西而不是其默認初始化值(null,引用類型)初始化
MyProperty
,您可以使用完整對像初始化。
例如:
// Sample 3
new TDest(new MySomeServiceImplementation()) { MyProperty = "This is the value of my property" };
希望它有所幫助!
為了有更好的想法,去看看 C#Object Initializers 。
在常規的原始C#中,答案是“沒有”。 但是,當涉及表達式樹時,存在差異; here 可以看到
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 {};
}
編譯為:
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);
}
因此,除了
Expression.New
之外,其中一個涉及
Expression.MemberInit
(帶有一組空的
MemberBinding
元素)。
這可能會擾亂任何不期望它的LINQ提供程序(或任何類似的表達式樹分析)。