簡體   English   中英

使用 new 創建時命名 ValueTuple 屬性

[英]Name ValueTuple properties when creating with new

我知道我可以在隱式創建元組時命名參數,例如:

var me = (age: 21, favoriteFood: "Custard");

顯式創建元組時是否可以命名參數? IE

var me = new ValueTuple<int, string>(21, "Custard");

不,你不能。 ValueTuple類型實際上獨立於 C# 中的命名字段支持。 后者更像是匿名類型的命名屬性。 也就是說,編譯器分析代碼並根據您的聲明和用法為適當的成員生成別名。 編譯器通過賦值來學習字段的名稱。 由於基本構造函數語法不提供命名字段的機制,因此您不能使用它直接生成具有命名字段的元組。

當然,您可以通過多種方式重新解釋從構造函數語法返回的值,為該返回值指定名稱。 我假設您知道這種方法並且正在尋找更直接的方法。

作為我所說的“重新解釋”的一個例子,你可以這樣做:

static (int value, string text) ConvertToNamed((int, string) t) => t;

然后這將在新變量中命名字段:

var t1 = new ValueTuple<int, string>(21, "hello");
var t2 = ConvertToNamed(t1);

變量t1Item1Item2卡在一起。 但是編譯器會隱式地為變量t2生成所需的名稱。

也許一個更好的例子是你不需要額外的方法:

(int value, string text) t = new ValueTuple<int, string>(21, "hello");

同樣,您並沒有真正在構造函數語法中命名字段,但它們由局部變量聲明重新解釋。

這可能不是一個嚴重的限制。 在希望有一個持久的、易於分配的名稱的場景中,聲明一個用戶定義的類型可能比使用元組語法更好。 您也可以為用戶定義的類型編寫解構函數,並且像這樣聲明類型意味着名稱在反射、 dynamic等方面是一等公民。

您可以在分配期間強制轉換為命名元組:

var me = ((int value, string text)) new ValueTuple<int, string>(21, "Custard");

... C# 7.0 在使用顯式 System.ValueTuple<...> 數據類型時不允許使用自定義項名稱。 因此,如果您替換圖 1 的示例 8 中的 var,您將得到警告,提示每個項目名稱都將被忽略。

資源

我發布這個答案是因為文檔最接近解釋的是:

ValueTuple 類型的數據成員是字段。 元組類型的數據成員是屬性。

在 Linq 中使用 ValueTuple 時正在尋找這個。 我做了一個 F2-rename 變量,它創建了以下語法:

var query = from x in myList
select (First: x.something, Second: x.other) into g
select new Whatever(g.First, g.Second);

我不這么認為。 這是我在 ValueTuple 上找到的文檔:

https://learn.microsoft.com/en-us/dotnet/api/system.valuetuple-7?view=netframework-4.7

我個人沒有使用過 ValueTuble 類型。 我以前像這樣使用過 Tuple 類:

var tuple = new Tuple<int, string>(21, "Custard");
var number = tuple.Item1;
var st = tuple.Item2;

但是我發現使用元組,尤其是當通過方法傳遞時,元組很笨重。 總是必須知道 Item1 和 Item2 等中的內容。根據 ValueTuple 文檔,它的使用方式相同。

你不應該只做一個實體類嗎?

我使用了 Anonymous Type,我認為它會滿足您的需求。

var anyom = new
{
    age = 21,
    favoriteFood = "Custard"
};

number = anyom.age;
st = anyom.favoriteFood;

暫無
暫無

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

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