簡體   English   中英

C#中的“對象表達”是否存在於F#中?

[英]Does “Object Expression” exist in C# like in F#?

F#語言中有一個有趣的概念:

Object Expressions (F#)

http://msdn.microsoft.com/en-us/library/dd233237.aspx

定義:

對象表達式是一種表達式,它創建基於現有基本類型,接口或接口集的動態創建的匿名對象類型的新實例。

我想知道,C#中是否存在類似的東西? 或者這些東西只能用F#編程語言?

不,那不存在。 我認為最接近的是實現這些接口的class

匿名類型無法符合接口或從任何東西派生。

Lambdas和delegates提供函數作為變量。

Object Expressions的文檔聲明了這一點,這使它聽起來像語言方便。

如果要避免創建新的命名類型所需的額外代碼和開銷,可以使用對象表達式。 如果使用對象表達式來最小化程序中創建的類型數,則可以減少代碼行數並防止不必要的類型擴散。 您可以使用自定義現有類型的對象表達式,或者為手頭的特定案例提供適當的接口實現,而不是僅僅為了處理特定情況而創建許多類型。

你可以用這樣的東西偽造它(雖然你不能將它限制在一個接口)

var foo = new { square = new Func<int, int>(x => x * x) };

我使用的模式是創建一堆“ad-hoc”類,它們實現了一個我用委托實例化的接口(通常是一個閉包):

例如:

public sealed class AdHocEquatable<T> : IEquatable<T>
{
    readonly Func<T, bool> equals;

    public AdHocEquatable(Func<T, bool> eq)
    {
        equals = eq;
    }

    public bool Equals(T other)
    {
        return equals(other);
    }
}

然后使用如下:

var eq = new AdHocEquatable<Person>(p => p.ID == some_person_ref.ID);

根據我的經驗,只有少數幾個接口(通常來自BCL)需要對象表達式。

有關更多示例,請參見此處

我認為你最接近的是委托(評論來自你給出的對象表達的描述):

public delegate int MyDelegate(int input);
// ...is based on an existing base type, interface, or set of interfaces

然后某個地方

MyDelegate myDelegate = (i) => i * 2;
// An object expression is an expression that creates a new instance of a dynamically created, anonymous object type

myDelegate(1); // returns 2

但這只涉及簽名。 方法,屬性 - 我想不出任何可以做到這一點的東西。


雖然...

需要記住的一件重要事情是,你可以在同一個解決方案中使用F#和C#,這樣你就可以隨時用C#編寫大部分應用程序,並使用F#執行無法在C#(如此)中完成的繁瑣位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM