簡體   English   中英

反向C#鋸齒形數組類型聲明

[英]C# jagged array type declaration in reverse

我剛才有一個“什么......”的時刻。 以下是否有意,C#中的數組“非自然”聲明背后是否存在一些模糊的推理?

int[,][] i; // declares an 2D - array where each element is an int[] !
// you have to use it like this:
i = new int[2,3][];
i[1,2] = new int[0];

我本來期待相反的方式。 int [,] []聲明一維數組,其中每個元素都是二維數組。

有趣的是,類型的名稱是相反的:

Console.WriteLine(typeof(int[,][]).Name); // prints "Int32[][,]"

有人可以解釋一下嗎? 這是故意的嗎? (在Windows下使用.NET 4.5。)

你可以在Eric Lippert的博客數組中找到一個冗長的討論。

C#實際上做了什么

一團糟。 無論我們選擇哪種選項,最終都不符合我們的直覺。 這是我們在C#中實際選擇的內容。

首先關閉:選項二[它是一個二維數組,每個元素是一維的一維數組]是正確的。 我們強迫你忍受Consequence One所帶來的怪異; 您實際上並沒有通過附加數組說明符將元素類型轉換為該類型的數組。 通過將說明符前置到現有數組說明符列表中,可以使其成為數組類型。 瘋狂但真實。

“prepending”這個詞部分解釋了反轉類型名稱的輸出。 CLR類型名稱不一定與C#聲明相同。

但更相關的報價在底部:

總而言之, 多維亂七八糟的數組幾乎肯定是一個糟糕的代碼味道。

我第一次見到new int[5][];我有同樣的“...... 而不是new int[][5];

EL的(非常好的)博客文章圍繞着一件事:有一個完美的方式為擁有ComSci學位的人做這件事 ,但沒有好辦法為其他人做這件事。 如果你只是遵循語法,聲明從右到左, new從右到左,左指數到右:

// 1D array of 2D arrays, no special rules needed:
int[,][] N; N=new[,][5]; N[0]=new int[4,4];

但是C#的目標受眾不是擁有4年CS學位的人(他們都看過反向波蘭人並且喜歡從右到左)。恕我直言,理解C#鋸齒狀陣列的訣竅在於他們決定為他們制定特殊規則,當他們在技術上不需要時。

暫無
暫無

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

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