C中String到底是引用型別還是值型別?很疑惑為什麼書上說的都自相矛盾啊

時間 2022-11-15 00:31:10

1樓:

對於新建.net框架的string類時,.net的各個語言是必須用類似

string s=new string(....); //string類屬於.net框架

但c#語言環境下定義了小寫的string(作為string類的別名),作為語言組成部分的關鍵字;也定義了"abc"作為字串的表現法。都不同於新建物件的語法。

string類屬於引用型別,因為

string a="hello";

string b=a;//這時不會複製乙份「hello」而是引用了a;

c#中string型別到底是值型別還是引用型別

2樓:匿名使用者

.net

框架程式設計(修訂版)中有這樣一段描述:string型別直接繼承自object,這使得它成為乙個引用型別,也就是說執行緒上的堆疊上不會駐留有任何字串。(譯註:

注意這裡的「直接繼承」。直接繼承自object的型別一定是引用型別,因為所有的值型別都繼承自system.valuetype。

值得指出的是system.valuetype卻是乙個引用型別。)。

3樓:匿名使用者

引用型別,但賦值給另乙個字串是複製所有字元。

初學c#,有些關於類的疑問。在c#中型別分為值型別和引用型別,而書上說類屬於引用型別,但值型別比如

4樓:匿名使用者

c# 語言有16種預定義型別 和 6種使用者自定義型別. 你先找出這22種都是哪些.

其中數值型別與非數值型別構成乙個大的簡單型別.

所有預定義型別都直接對映到底層的.net型別. 但是c#程式中不鼓勵直接呼叫.net型別名稱.

(c#的值型別並非類定義出來的, 而是c#語言本身預定義了關鍵字. 就跟c語言預定義的關鍵字一樣)

而c# int 對映到 .net下 int32, .net下的int32定義為結構型別. 結構型別屬於值型別.

在學習c#時最好明確區分c#和.net在運作時的關聯. 建議學習時看看老外寫的書.

*************************==

我x....真是服了, 被採納的回答混淆了 .net的對映 和c#語言....int32 根本不屬於c#語言型別. 而是.net底層型別而已.

好好看下我給你講的才是真學習的邏輯

5樓:匿名使用者

值型別是結構,不是類。結構和類都是型別。所有的值型別本質都是結構,所有的引用型別本質都是類。

int32是結構型別,也是值型別。結構型別用struct宣告,而類型別用class宣告。

c#中string型別是什麼型別

6樓:匿名使用者

string是引用型別,但它也有一些值型別的特徵。

string傳值還是傳引用

c#的string宣告是class string,當然是傳引用。

不過,之所以有這個疑惑,多數是因為這個情況:

string a = "aaa";

string b = a;

b = "bbb";

或者是這麼幾行**:

public void swap(string s1, string s2)

這時候結果一列印,結果發現a的值還沒有變,swap也沒有成功,這時候就會有幻覺:是不是沒有傳引用啊?

呵呵,string不會這麼粗暴的打亂「宣告為class就是傳引用」這種規則的。

分析一下:

string a = "aaa"; //==> a----->new string("aaa")

string b = a; //==> b----->a, 傳引用

b = "bbb"; //==> b----->new string("bbb"), 傳引用,b指向了乙個新的字串,a並沒有變。

swap函式也是這樣,比如說傳了a, b進去(a="aaa", b="bbb"),

//s1----->a, s2----->b

string temp=s1;//temp----->s1----->a

s1=s2; //s1----->s2----->b;

s2=temp; //s2----->temp----->a

結果是,s1和s2確實是swap了,但是這種結果並不會影響到a和b

7樓:匿名使用者

string是乙個引用型別,在棧上保持引用,在堆上(確切地說:是在字串區)保持資料。

string str = null; //在堆上沒有分配資料

string str = ""; //在堆上分配了空資料

string str = "abc"; //在字串區尋找"abc",若找到,就將str引用指向它;若沒有找到,就建立"abc",再讓str指向它。

對以下**的認識:

string a = "aaa"; //==> a----->new string("aaa")

string b = a; //==> b----->a, 傳引用

b = "bbb"; //==> b----->new string("bbb"), 傳引用,b指向了乙個新的字串,a並沒有變

對字串變數進行賦值時,會在在字串區尋找該值是否已經存在,若存在,就將引用指向它;若沒有找到,就建立,再讓引用指向它。

如:string str1 = "think";

string str2 = "think";

console.writeline(object.referenceequals(str1, str2));

//結果為true,str1和str2指向統一記憶體

8樓:匿名使用者

string是乙個引用型別

c#中值型別和引用型別的區別

9樓:大野瘦子

1、速度上的區別

值型別訪問速度快,引用型別訪問速度慢。

2、用途上的區別

值型別表示實際資料,引用型別表示指向儲存在記憶體堆中的資料的指標或引用。

3、**上的區別

值型別繼承自system.valuetype,引用型別繼承自system.object

4、位置上的區別

值型別的資料儲存在記憶體的棧中,引用型別的資料儲存在記憶體的堆中,而記憶體單元中只存放堆中物件的位址。

5、型別上的區別

值型別的變數直接存放實際的資料,而引用型別的變數存放的則是資料的位址,即物件的引用。

6、儲存位置上的區別

值型別變數直接把變數的值儲存在堆疊中,引用型別的變數把實際資料的位址儲存在堆疊中,而實際資料則儲存在堆中。

例如:字串型別,而堆疊則用於儲存固定長度的資料,如整型型別的資料int(每個int變數占用四個位元組)。

由資料儲存的位置可以得知,當把乙個值變數賦給另乙個值變數時,會在堆疊中儲存兩個完全相同的值;而把乙個引用變數賦給另乙個引用變數,則會在堆疊中儲存對同乙個堆位置的兩個引用,即在堆疊中儲存的是同乙個堆的位址。

在進行資料操作時,對於值型別,由於每個變數都有自己的值,因此對乙個變數的操作不會影響到其它變數;對於引用型別的變數,對乙個變數的資料進行操作就是對這個變數在堆中的資料進行操作,

如果兩個引用型別的變數引用同乙個物件,實際含義就是它們在堆疊中儲存的堆的位址相同,因此對乙個變數的操作就會影響到引用同乙個物件的另乙個變數。

10樓:風琬鈕若雲

1值型別。

定義時只有型別和變數名。沒有&符號的為值型別。表示本身的值。有自己的記憶體空間。可以不做初始化。

2引用型別。

定義時,型別

&變數名=另乙個變數名。

表示引用。自身沒有記憶體空間,使用初始化時的變數空間。是另乙個變數名的乙個別名。

引用在定義時必須初始化。

11樓:匿名使用者

每乙個值型別都有乙個獨立的記憶體區域儲存自己的值,呼叫它的時候呼叫的是他的值,而應用型別呼叫的是記憶體中的位址。

比如a1=18,這時候在記憶體中儲存的是18,當把a1賦值給a2的時候,他們兩個引用的是同乙個記憶體空間,a2的值會儲存為a1的值,當把a2改為20後,因為a1和a2引用的是同乙個記憶體位址,所以a1也變成20,這是引用型別。

值型別是當把a1賦值給a2時,會為a2再開一塊新的記憶體空間儲存a1的值。當把a2改成20時,只會在a2的空間儲存20,和a1沒關係了。

12樓:森振華星戊

你得到的結果還是一樣的確良20

和20student3.age

=18;

--->age=18;

student4

=student3;

--->student4=18;

student4.age

=20;

--->student4=20;

--->age=20先前那個age被替了

----->20,20

13樓:潮佑平衡鶯

值型別都是深拷貝,就是把記憶體中的資料賦值給另一快記憶體。

引用型別都是淺拷貝,就是被指向一塊記憶體的位址拷貝給了另乙個引用。

值型別用=是值傳遞

會在記憶體中在開闢一塊新的記憶體,

比如inta=

1;intb=

a;記憶體中就開了2快記憶體分別是a和b,結構也是值型別所以沒問題。問題在於類,如果你沒有寫「=」號賦值運算子,那麼student3

=student4;讓student3也指向student4的記憶體,然後你再給student4這塊記憶體賦值20

那麼student3就也等於20了。而且classstudentstudent3

=new

classstudent();這塊記憶體,如果沒有.net的垃圾**的話,在c++中就是記憶體洩露了。

14樓:匿名使用者

不知道你學過c沒有,演過c的話就很好理解這個問題,引用相當於你在c裡面使用指標,

如:寫乙個函式的時候

public int fuction1(ref int a,ret int b)

public static main()

當你在function1中間把a,b變數的值改變後,main函式裡面的a,b 值也就改變了

成了a=2,b=3了

15樓:匿名使用者

它們的區別在於使用的記憶體位置不同:值型別資料儲存在棧上,而引用型別資料儲存在堆上。

值型別直接包含值,換言之,變數引用的位置就是值在記憶體中實際儲存的位置。

引用型別並不直接儲存值,它們儲存的是對乙個記憶體位置的引用(記憶體位址),要去那個位置才能找到真正的資料。

------------------《c#本質論》(essential c# 2.0)

string 是引用型別還是值型別

16樓:匿名使用者

string 是引用型別

c#中值型別和引用型別

17樓:匿名使用者

你的問題涉及到記憶體的設計。

記憶體裡都是0和1 沒有錯,但無論什麼時候,你要到記憶體去找乙個東西,你必須先知道乙個位址。然後才能到那個位址去讀那裡的0和1.

兩者的區別就是:

在值型別你按位址讀出來的就是你需要的東西,引用型別你按位址讀出來的又是乙個新位址,新位址裡存檔才是你要的東西。

就像你在購物中心找廁所,你看到乙個廁所標誌,和乙個箭頭,在值型別你順著箭頭走過去就是廁所了,

引用型別你順著箭頭走過去看到另乙個廁所標誌,和另乙個箭頭。

到底是選C還是D?有些答案是C,有些是D

微處理器就是所說的cpu,效能指標應該主要是字長,主頻好象不是效能指標。微控制器俗稱微控制器,這個好象要看主頻 微型計算機,簡稱微型機或微機。將傳統計算機的運算器和控制器整合在一塊大規模積體電路晶元上作為 處理單元 cpu 稱為微處理器。微型計算機是以微處理器為核心,再配上儲存器和介面電路等晶元構成...

高達seeddestiny中到底是誰殺死斯黛拉的

是基拉殺的,因為基拉砍了穆 在史黛拉看來是他喜歡的人 所以,在真勸史黛拉的時候,看見了基拉 之後發飆 基拉為了保護真,把史黛拉殺了 不知死沒死 然後真認為她死了,就放到水裡了。第一,史黛拉在沉下水的時候已經死了 第二,基拉不是因為保護真而擊毀史黛拉的ms,完全是因為史黛拉的精神失控 第三,如果是真殺...

溶液中的電流到底是怎樣形成的,電流到底是怎樣形成的呢?

電流的形成與電流方向 電流就是電荷的定向移動呀,溶液中的陰陽離子相向運動,當然產生了電流,在負極板附近,外加電源提供的電子傳給了運動過來的陽離子,而在正極附近,陰離子將多餘的電子傳給了極板,這個過程就是電解。具體哪種離子放電要看具體情況,但總的來說電流是從正極板流向了負極板。簡單的可以這樣說,就是有...

請問C中get和SET到底是什麼意思啊

get set是用來擴充套件域的,也就是c裡的變數,只是用起來更加靈活而己。看以下 using system public class cls set public static void main 執行結果為 aaadsf 120也就是先把120賦值給value 相當乙個儲存空間 然後再用get ...

英語中的THE到底是怎麼用,英語裡「the」是怎麼用?為什麼要加「the」?

那你就簡單的把一些固定的和the相連的片語背下來。其實,定冠詞the的用法很簡單,不僅要特指,還有專指,起到的作用就是強調,避免產生歧義。例如你的第一句 圖書館不是你固定的經常去的場所,加上定冠詞the,可以讓對話的人知道你說的圖書館是你和他都知道的那個圖書館,如果不加the,那就是泛指所有的圖書館...