C#結構體
轉自:http://wenku.baidu.com/view/e8217edb6f1aff00bed51e36.html
結構體的定義:
結構體也可以象類一樣可以單獨定義.
class a{};
struct a{};
結構體也可以在名字前面加入控制訪問符.
public struct student{};
internal struct student{};
如果結構體student沒有publice或者internal的宣告 類program就無法使用student結構定義 obj物件
如果結構體student的元素沒有public的宣告,物件obj就無法呼叫元素x
因為預設的結構體名和元素名是private型別
程式:
using System;
public struct student
{
public int x;
};
class program
{
public static void Main()
{
student obj=new student();
obj.x=100;
}
};
在結構體中也可以定義靜態成員與類中一樣,使用時必須用類名,或結構名來呼叫不屬於例項,宣告時直接定義.
程式:
using System;
public struct student
{
public static int a = 10;
};
class exe
{
public static void Main()
{
Console.WriteLine( student.a = 100);
}
};
或
using System;
class base
{
public struct student
{
public static int a = 10;
};
}
class exe
{
public static void Main()
{
Console.WriteLine( base.student.a = 100);
}
};
在結構體中可以定義建構函式以初始化成員,但不可以重寫預設無參建構函式和預設無參解構函式
程式:
public struct student
{
public int x;
public int y;
public static int z;
public student(int a,int b,int c)
{
x=a;
y=b;
student.z=c;
}
};
在結構體中可以定義成員函式。
程式:
public struct student
{
public void list()
{
Console.WriteLine("這是構造的函式");
}
};
結構體的物件使用new運算子建立(obj)也可以直接建立單個元素賦值(obj2)這是與類不同的因為類只能使用new建立物件
程式:
public struct student
{
public int x;
public int y;
public static int z;
public student(int a,int b,int c)
{
x=a;
y=b;
student.z=c;
}
};
class program
{
public static void Main()
{
student obj=new student(100,200,300);
student obj2;
obj2.x=100;
obj2.y=200;
student.z=300;
}
}
在使用類物件和函式使用時,使用的是引用傳遞,所以欄位改變
在使用結構物件和函式使用時,是用的是值傳遞,所以欄位沒有改變
程式:
using System;
class class_wsy
{
public int x;
}
struct struct_wsy
{
public int x;
}
class program
{
public static void class_t(class_wsy obj)
{
obj.x = 90;
}
public static void struct_t(struct_wsy obj)
{
obj.x = 90;
}
public static void Main()
{
class_wsy obj_1 = new class_wsy();
struct_wsy obj_2 = new struct_wsy();
obj_1.x = 100;
obj_2.x = 100;
class_t(obj_1);
struct_t(obj_2);
Console.WriteLine("class_wsy obj_1.x={0}",obj_1.x);
Console.WriteLine("struct_wsy obj_2.x={0}",obj_2.x);
Console.Read();
}
}
結果為:class_wsy obj_1.x=90
struct_wsy obj_2.x=100
說說struct。對於struct,在一定程度上與class非常相像,分析一下:
class program
{
static void Main(string[] args)
{
STR str1;
str1.Method("str1");//第一種方法,直接定義
STR str2 = new STR();
str2.Method("str2"); //第二種方法,通過new關鍵字
}
}
struct STR
{
public void Method(string Par)
{
Console.WriteLine("引數是:"+Par);
}
}
一個是直接定義來呼叫,也可以通過new關鍵字來定義呼叫,這是與類不同的,類必需經過例項化(new)來定義呼叫(靜態成員是通過類名呼叫,沒有定義)。
接下來再看一個例子。
class program
{
static void Main(string[] args)
{
STR str1;//第一種
str1.count = 100;//賦值
Console.WriteLine(str1.count);
STR str2 = new STR();//第二種
Console.WriteLine(str2.count);
}
}
struct STR
{
public int count;
}
當結構體中定義一個全域性變數時(類中叫欄位),這個count是沒有值的,這是與類不同的,在類中,所有的欄位都有預設值,結構中是沒有的。既然沒有預設值,那在第二種例項化直接呼叫時,str2.count輸出的為什麼是0,這個0是沒有事前賦值的。如果是類,我們知道,類是有建構函式的,如果我們不顯式寫上建構函式,CLR會自動給我們加上一個沒有引數的建構函式的,並且這個建構函式是可以被顯式的寫出來的。同樣,結構也是有一個建構函式,但這個建構函式是不能夠寫出來的,並且這個建構函式很特別,從第二種就能看出,只要用new關鍵字來例項化結構,就會把count給初始化成0,也就是那個不能寫出來的無參建構函式會初始化所有的結構中的全域性變數。對於第一種,因為沒有呼叫無參的建構函式,所以必需去顯式的給結構中的全域性變數去賦值。
如果結構裡有有參建構函式,程式碼如下:
class program
{
static void Main(string[] args)
{
STR str = new STR("");//例項化
Console.WriteLine(str.count);
}
}
struct STR
{
public int count;
public STR(string str)
{
count = 1;
}
}
會發現,如果是個有參建構函式,在構造中必需去初始化結構中的全域性變數,因為如果用有參建構函式的話,無參的就不會得到呼叫,結構中的全域性變數就得不到初始化,所以必需在有參建構函式中去初始化它。如果有多個全域性變數,都得在這個有參建構函式中去例項化它們。
相關文章
- 瞭解下C# 結構體(Struct)C#結構體Struct
- C# 中 System.Range 結構體C#結構體
- C#中結構體的應用C#結構體
- 【C#學習筆記】結構體使用C#筆記結構體
- C# 結構體與類的區別C#結構體
- C#結構C#
- C#:結構C#
- c#中結構體和類的比較C#結構體
- C# 中的只讀結構體(readonly struct)C#結構體Struct
- 小心C#中的只讀結構體成員C#結構體
- c#之IntPtr結構C#
- 【C#——溫習中體會你的三大結構】C#
- C#結構體和位元組陣列的轉換C#結構體陣列
- 結構體中套用其他_結構體結構體
- 瞭解下C# 程式結構C#
- 認知結構(C# Struct)C#Struct
- Oracle體系結構:記憶體結構和程式結構(轉)Oracle記憶體
- 結構體結構體
- Oracle體系結構之-記憶體結構Oracle記憶體
- C#記憶體對映大檔案並使用Marshal解析結構體資訊C#記憶體結構體
- C#中的資料結構C#資料結構
- 資料結構(C#):佇列資料結構C#佇列
- C#資料結構-靜態連結串列C#資料結構
- Oracle體系結構之-物理結構Oracle
- Go 結構體Go結構體
- 結構體struct結構體Struct
- 結構體與共用體結構體
- C# 8: 可變結構體中的只讀例項成員C#結構體
- .NET C#基礎(5):結構體 - 高效能程式碼的基石C#結構體
- dotnet C# 結構體出方法彈棧之後的行為C#結構體
- Oracle體系結構之記憶體結構(SGA、PGA)Oracle記憶體
- c#之結構struct(2)_小記C#Struct
- 3:Oracle體系結構(邏輯結構)Oracle
- [Virtualization]ESXi體系結構與記憶體管理(一)體系結構記憶體
- C#資料結構-二叉樹-順序儲存結構C#資料結構二叉樹
- ORACLE體系結構小結Oracle
- oracle體系結構總結Oracle
- 【PG體系結構】PG體系結構簡單說明