為什麼很多 C 粉認為 Void 不應該是型別, 是否大多數 C 使用者都這樣認為

時間 2021-05-05 16:37:55

1樓:Tracy Liang

我認為不是,如果按照可以定義變數的語法層面講,void a;不合法,所以不認為是乙個型別。但void*是。

vb. net就沒有void。void 在cs是用來修飾函式返回值的關鍵字。

func name(param:type) [:type]{}這種形式的語法完全避開了void的使用。

同樣null是什麼型別,default是什麼值。當關鍵字就好。

2樓:lhrbu

void不應該是型別,否則如何區分Func, Func, Func ...?

3樓:架構師

這種問題,我覺得還是看權威吧

可以將void用作方法(或本地函式)的返回型別來指定該方法不返回值。

public static void Display(IEnumerable numbers)

還可以將 void 用作引用型別來宣告指向未知型別的指標。 有關詳細資訊

不能將 void 用作變數的型別。

至於Void是什麼,莫過於官網的定義了

public struct Void

Void結構用於System.Reflection命名空間,但在典型的應用程式中很少用到。Void除了所有型別都繼承自類的成員以外,結構不包含任何成員Object。

4樓:

void表示的是在棧上的空間為0,例如乙個public static void SomMethod()方法,void表示的是返回值所佔的空間是0

而System.Void是乙個值型別,雖然他內部什麼都沒有,但是CLR還是會為他分配1位元組的空間。

如果System.Void能夠使用,那麼這兒就有矛盾了,public static void SomMethod()的返回值是應該佔1位元組的空間,還是佔0位元組的空間呢?

這也就是為什麼C#不讓你用System.Void的原因,而至於為什麼還要有System.Void這個型別,那是因為反射的需要。

最後說一句,按理來說CLR是可以區分void在什麼時候佔0位元組,在什麼時候佔1位元組,但是因為不知名的原因(可能是因為懶)沒有對此區分,而是直接從編譯器上下手,讓你用不了System.Void。

5樓:紀淅

想不出來void這個型別能用來幹啥。。。原文的問題作者可以選擇action。

func的需要乙個返回值,但是那個作者並沒有return乙個void。

如果有這個型別,他是基於object的嗎?

6樓:正怒月神

缺陷?肯定有啊。

找哪門子語言,都能說出缺陷。

下面進入正題。

void是一種返回型別。這很正常。不展開贅述了。

但是要說 Fun之類的為什麼不行。

要求有這種,來取代 Action的功能。

那只能說異想天開。

不然我乙個 List,應該怎麼賦值呢?賦什麼呢?語言很有歧義不是嗎

7樓:

很多語言都存在這個問題

那就是它們的Void表達的實際上是Unit

型別理論的成熟並不是很早,也沒規定每個名字對應的含義應該是什麼,所以這些關鍵字真正的含義還是要看這門語言自己怎麼說,對吧?

無論如何,Void當然是乙個型別了,它出現在型別該出現的地方,和其它型別作用相同,只是規則特殊一些罷了;而且它的規則必然是特殊的,因為它是0型別,不可居留(沒有值)

C#中的Void同時具有空型別和單元型別的一些特徵,更像是空型別,因為不能構造它的值

C#在早期設計的時候是有不少糟粕的,比如區別對待返回值型別為void和非void的函式

8樓:流清商

簡單來說,void 是一種型別,或者說至少在標準中處理方法返回值的部分,它被視為一種型別。最直接的依據是 C# 語言標準中的這一句:

The result typeof a method is void if the return type is void, or if the method is async and the return type is System.Threading.Tasks.

Task. Otherwise, the result type of a non-async method is its return type, and the result type of an async method with return type System.Threading.

Tasks.Task is T.

但是 void 不是一種「一般的」型別,它表示的是一種「缺少型別」的狀態,因此不能用於定義變數型別或者用於泛型。只能在方法中表示無法返回或者在 void* 指標型別中表示指向的資料型別不明。

The third form of typeof_expression consists of a typeof keyword followed by a parenthesized void keyword. The result of an expression of this form is the System.Type object that represents the absence of a type.

9樓:天空

這種不同角度就有不同答案,沒有對與錯,我個人的看法是void是一種叫沒有型別的型別,因此它是不存在值得說法的,所以是return;有點像Rust裡的拋異常返回的型別(即Never型別),這個型別可以要也可以不要,比如dart裡有了Null類我覺得void就可以乾掉了;

為什麼C 中 void 能指向靜態成員函式但不能指非靜態向成員函式?

檀十一郎 讓我們來強行搞編譯器一波 class A fp A a A pa a pa fp.fpa fp.fp void 因為A test沒用到this,所以這麼搞也能工作。return 0 朱涵俊 靜態成員函式跟靜態函式沒區別,就是乙個作用域不同而已。可以看成普通的非成員函式。成員函式在傳引數時候...

為什麼f(x)死忠粉很多?

沙漫駝鈴 每次都有不一樣的風格 每個人都很好,很有能力 每次都能被反覆重新圈粉 沒有很狂熱但也真的是我的青春 哪天真的可以合體,我真的會有那種青春完結了的感覺。玻璃心其實已經不敢期待,但是還是不願意死心,如果有人對我說 函式不會再合體了吧,函式解散了嗎?我會說,合體的說不准,但是還沒解散!對合體已經...

為什麼知乎很多位元幣粉?

勿忘初心 接盤是沒人玩了,出手困難找人填坑。他們只是宣傳位元幣,讓更多人知道,得到更多的共識,這樣才會更有價值,就好比我宣傳雷達幣一樣。自己投資的專案都不看好,整天人云亦云,提心吊膽的,都不去宣傳他,推廣他,這樣的人怕是個傻子。 黃安寧 其實沒有多少位元幣粉!因為 一 早期的極客和布道者是信仰者。二...