如何准确区分C类产品与其它类别?
- 内容介绍
- 文章标签
- 相关推荐
本文共计2249个文字,预计阅读时间需要9分钟。
《C语言中结构体与类的区别》本文翻译自Manju lata Yadav于2019年6月2日发表的文章《Difference Between Struct And Class In C》。
在C语言中,结构体(struct)和类(class)都是用户定义的数据类型。它们都可以包含多个数据类型的成员,但它们在用途和用法上有所不同。
结构体:结构体是一种复合数据类型,可以包含不同类型的数据成员。结构体主要用于将相关联的数据组织在一起,以便在程序中处理。以下是一个简单的结构体示例:
cstruct Student { int rollNo; char name[50]; float marks;};
在这个例子中,`Student`结构体包含了三个成员:`rollNo`(整数类型),`name`(字符数组类型),和`marks`(浮点数类型)。
类:类是面向对象编程(OOP)语言中的一个核心概念。在C语言中,类用于创建面向对象程序。类可以包含数据成员(属性)和方法(函数)。以下是一个简单的类示例:
cclass Student {public: int rollNo; char name[50]; float marks;
void printDetails() { printf(Roll No: %d\n, rollNo); printf(Name: %s\n, name); printf(Marks: %.2f\n, marks); }};
在这个例子中,`Student`类包含了三个数据成员:`rollNo`,`name`,和`marks`。此外,它还包含一个方法`printDetails`,用于打印学生的详细信息。
主要区别:
1.结构体是C语言的一个基本特性,而类是面向对象编程语言(如Java、C++)的一个特性。
2.结构体可以包含任何类型的数据成员,而类通常包含属性(数据成员)和方法(函数)。
3.结构体在C语言中主要用于数据组织,而类在面向对象程序中用于实现封装、继承和多态。
总结:
结构体和类在C语言中都是用户定义的数据类型。它们在用途和用法上有所不同,但都是构建复杂程序的重要工具。翻译自 Manju lata Yadav 2019年6月2日 的博文 《Difference Between Struct And Class In C#》,补充了一些内容和示例。
结构体(struct)是类(class)的轻量级版本。结构体是值类型,可用于创建行为类似于内置类型的对象。
比较
结构体和类共享许多特性,但与类相比有以下局限性。
- 结构体不能有默认构造函数(无参构造函数)或析构函数,构造函数中必须给所有字段赋值。
public struct Coords { public double x; public double y; public Coords() //错误,不允许无参构造函数 { this.x = 3; this.y = 4; } public Coords(double x) //错误,构造函数中必须给所有字段赋值 { this.x = x; } public Coords(double x) //这个是正确的 { this.x = x; this.y = 4; } public Coords(double x, double y) //这个是正确的 { this.x = x; this.y = y; } }
- 结构体是值类型,在赋值时进行复制。
- 结构体是值类型,而类是引用类型。
- 结构体可以在不使用
new操作符的情况下实例化。 例如:
public struct Coords { public double x; public double y; } static void Main() { Coords p; p.x = 3; p.y = 4; Console.WriteLine($"({p.x}, {p.y})"); // 输出: (3, 4) }
- 结构体不能继承于另一个结构体或者类,类也不能继承结构体。所有结构体都直接继承于抽象类 System.ValueType,
System.ValueType又继承于System.Object。 - 结构体不能是基类,因此,结构体不能是
abstract的,且总是隐式密封的(sealed)。 - 不允许对结构体使用抽象(
abstract)和密封(sealed)修饰符,也不允许对结构体成员使用protected或protected internal修饰符。 - 结构体中的函数成员不能是抽象的(
abstract)或虚的(virtual),重写(override)修饰符只允许重写从System.ValueType继承的方法。 - 结构体中不允许实例属性或字段包含初始值设定项。但是,结构体允许静态属性或字段包含初始值设定项。 例如:
public struct Coords { public double x = 4; //错误, 结构体中初始化器不允许实例字段设定初始值 public static double y = 5; // 正确 public static double z { get; set; } = 6; // 正确 }
- 结构体可以实现接口。
- 结构体可以用作
nullable type(即:Nullable<T>中的T),对其赋值 null 值,参考
什么时候使用结构体或类?
要回答这个问题,我们应该很好地理解它们的差异。
序号
结构体(struct)
类(class)
这样,结构体(struct)只能在确定以下情形时使用:
- 它在逻辑上表示单个值,比如基本类型(
int,double,等等)。 - 它是不可变的(immutable)。
- 它不会频繁地装箱和拆箱。
在所有其他情形,应该将类型定义为类(class)。
结构体示例:
struct Location { public int x, y; public Location(int x, int y) { this.x = x; this.y = y; } } static void Main() { Location a = new Location(20, 20); Location b = a; a.x = 100; Console.WriteLine(b.x); }
输出将是 20。“b” 的值是 “a” 的副本,因此 “b” 不受 “a.x” 更改的影响。但是在类中,输出将是 100,因为变量 “a” 和 “b” 引用同一个对象。
以下为译者补充
结构体实例与类实例
结构体实例的内存在栈(stack)上进行分配,所占用的内存随声明它的类型或方法一起回收。 这就是在赋值时要复制结构体的一个原因。 相比之下,类实例的内存在堆(heap)上进行分配,当对类实例的所有引用都超出范围时,为该类实例分配的内存将由公共语言运行时自动回收(垃圾回收)。
结构体实例的值相等性
两个结构体实例的比较是基于值的比较,而类实例的比较则是对其引用的比较。
若要确定两个结构体实例中的实例字段是否具有相同的值,可使用 ValueType.Equals 方法。 由于所有结构都隐式继承自 System.ValueType,因此可以直接在其对象上调用该方法,如以下示例所示:
public struct Person { public string Name; public int Age; public Person(string name, int age) { Name = name; Age = age; } } static void Main() { Person p1 = new Person("技术译站", 100); Person p2; p2.Name = "技术译站"; p2.Age = 100; if (p2.Equals(p1)) Console.WriteLine("p2 和 p1 有相同的值。"); Console.ReadKey(); } // 输出: p2 和 p1 有相同的值。
System.ValueType 是值类型的隐式基类, 它的 Equals 使用反射实现,因为它必须能够确定任何结构体中有哪些字段。 在创建自己的结构体时,重写 Equals 方法可以提供特定于你的类型的高效求等算法。
“基于值的相等”这一点和 C# 9.0 中新增的记录(record) 类型具有相似之处
作者 : Manju lata Yadav
译者 : 技术译民
出品 : 技术译站
链接 : 英文原文
以上就是区分C# 中的 Struct 和 Class的详细内容,更多关于C# 中 Struct 和 Class的资料请关注易盾网络其它相关文章!
本文共计2249个文字,预计阅读时间需要9分钟。
《C语言中结构体与类的区别》本文翻译自Manju lata Yadav于2019年6月2日发表的文章《Difference Between Struct And Class In C》。
在C语言中,结构体(struct)和类(class)都是用户定义的数据类型。它们都可以包含多个数据类型的成员,但它们在用途和用法上有所不同。
结构体:结构体是一种复合数据类型,可以包含不同类型的数据成员。结构体主要用于将相关联的数据组织在一起,以便在程序中处理。以下是一个简单的结构体示例:
cstruct Student { int rollNo; char name[50]; float marks;};
在这个例子中,`Student`结构体包含了三个成员:`rollNo`(整数类型),`name`(字符数组类型),和`marks`(浮点数类型)。
类:类是面向对象编程(OOP)语言中的一个核心概念。在C语言中,类用于创建面向对象程序。类可以包含数据成员(属性)和方法(函数)。以下是一个简单的类示例:
cclass Student {public: int rollNo; char name[50]; float marks;
void printDetails() { printf(Roll No: %d\n, rollNo); printf(Name: %s\n, name); printf(Marks: %.2f\n, marks); }};
在这个例子中,`Student`类包含了三个数据成员:`rollNo`,`name`,和`marks`。此外,它还包含一个方法`printDetails`,用于打印学生的详细信息。
主要区别:
1.结构体是C语言的一个基本特性,而类是面向对象编程语言(如Java、C++)的一个特性。
2.结构体可以包含任何类型的数据成员,而类通常包含属性(数据成员)和方法(函数)。
3.结构体在C语言中主要用于数据组织,而类在面向对象程序中用于实现封装、继承和多态。
总结:
结构体和类在C语言中都是用户定义的数据类型。它们在用途和用法上有所不同,但都是构建复杂程序的重要工具。翻译自 Manju lata Yadav 2019年6月2日 的博文 《Difference Between Struct And Class In C#》,补充了一些内容和示例。
结构体(struct)是类(class)的轻量级版本。结构体是值类型,可用于创建行为类似于内置类型的对象。
比较
结构体和类共享许多特性,但与类相比有以下局限性。
- 结构体不能有默认构造函数(无参构造函数)或析构函数,构造函数中必须给所有字段赋值。
public struct Coords { public double x; public double y; public Coords() //错误,不允许无参构造函数 { this.x = 3; this.y = 4; } public Coords(double x) //错误,构造函数中必须给所有字段赋值 { this.x = x; } public Coords(double x) //这个是正确的 { this.x = x; this.y = 4; } public Coords(double x, double y) //这个是正确的 { this.x = x; this.y = y; } }
- 结构体是值类型,在赋值时进行复制。
- 结构体是值类型,而类是引用类型。
- 结构体可以在不使用
new操作符的情况下实例化。 例如:
public struct Coords { public double x; public double y; } static void Main() { Coords p; p.x = 3; p.y = 4; Console.WriteLine($"({p.x}, {p.y})"); // 输出: (3, 4) }
- 结构体不能继承于另一个结构体或者类,类也不能继承结构体。所有结构体都直接继承于抽象类 System.ValueType,
System.ValueType又继承于System.Object。 - 结构体不能是基类,因此,结构体不能是
abstract的,且总是隐式密封的(sealed)。 - 不允许对结构体使用抽象(
abstract)和密封(sealed)修饰符,也不允许对结构体成员使用protected或protected internal修饰符。 - 结构体中的函数成员不能是抽象的(
abstract)或虚的(virtual),重写(override)修饰符只允许重写从System.ValueType继承的方法。 - 结构体中不允许实例属性或字段包含初始值设定项。但是,结构体允许静态属性或字段包含初始值设定项。 例如:
public struct Coords { public double x = 4; //错误, 结构体中初始化器不允许实例字段设定初始值 public static double y = 5; // 正确 public static double z { get; set; } = 6; // 正确 }
- 结构体可以实现接口。
- 结构体可以用作
nullable type(即:Nullable<T>中的T),对其赋值 null 值,参考
什么时候使用结构体或类?
要回答这个问题,我们应该很好地理解它们的差异。
序号
结构体(struct)
类(class)
这样,结构体(struct)只能在确定以下情形时使用:
- 它在逻辑上表示单个值,比如基本类型(
int,double,等等)。 - 它是不可变的(immutable)。
- 它不会频繁地装箱和拆箱。
在所有其他情形,应该将类型定义为类(class)。
结构体示例:
struct Location { public int x, y; public Location(int x, int y) { this.x = x; this.y = y; } } static void Main() { Location a = new Location(20, 20); Location b = a; a.x = 100; Console.WriteLine(b.x); }
输出将是 20。“b” 的值是 “a” 的副本,因此 “b” 不受 “a.x” 更改的影响。但是在类中,输出将是 100,因为变量 “a” 和 “b” 引用同一个对象。
以下为译者补充
结构体实例与类实例
结构体实例的内存在栈(stack)上进行分配,所占用的内存随声明它的类型或方法一起回收。 这就是在赋值时要复制结构体的一个原因。 相比之下,类实例的内存在堆(heap)上进行分配,当对类实例的所有引用都超出范围时,为该类实例分配的内存将由公共语言运行时自动回收(垃圾回收)。
结构体实例的值相等性
两个结构体实例的比较是基于值的比较,而类实例的比较则是对其引用的比较。
若要确定两个结构体实例中的实例字段是否具有相同的值,可使用 ValueType.Equals 方法。 由于所有结构都隐式继承自 System.ValueType,因此可以直接在其对象上调用该方法,如以下示例所示:
public struct Person { public string Name; public int Age; public Person(string name, int age) { Name = name; Age = age; } } static void Main() { Person p1 = new Person("技术译站", 100); Person p2; p2.Name = "技术译站"; p2.Age = 100; if (p2.Equals(p1)) Console.WriteLine("p2 和 p1 有相同的值。"); Console.ReadKey(); } // 输出: p2 和 p1 有相同的值。
System.ValueType 是值类型的隐式基类, 它的 Equals 使用反射实现,因为它必须能够确定任何结构体中有哪些字段。 在创建自己的结构体时,重写 Equals 方法可以提供特定于你的类型的高效求等算法。
“基于值的相等”这一点和 C# 9.0 中新增的记录(record) 类型具有相似之处
作者 : Manju lata Yadav
译者 : 技术译民
出品 : 技术译站
链接 : 英文原文
以上就是区分C# 中的 Struct 和 Class的详细内容,更多关于C# 中 Struct 和 Class的资料请关注易盾网络其它相关文章!

