c#中的OOP数据类型是什么?他们是班级吗?

时间:2012-10-31 12:59:07

标签: c# oop class object

我制作的每个类都需要使用NEW关键字来实例化它。我不知道Oledbconnection是一个类(因为它需要一个新的关键字)???如果它是int,bool,char也是类??? 我只需要清除我的概念。

3 个答案:

答案 0 :(得分:2)

.NET中的大多数类型派生自一个类的对象。所以你可以说所有这些都是类,但其中一些派生自ValueType,其行为与引用类型不同。参考类型是大多数人在谈论课程时所参考的内容。在这方面,值类型如int,bool和任何(其他)结构都不是类。

接口既不是类也不是struct / ValueType它是接口。

int x = 0; //由0表示的对象是int类型,它是ValueType x.ToString(); // ToString由基类型Object实现,它是一个类 (IComparable的)x)的.CompareTo(1); //System.Int32实现了该接口

除了拳击之外,上面说明了根据您的看法,对象可能被归类为ValueType,Class或interface

真正需要担心的不是某个东西是类,界面还是别的东西。因为根据您的看法,大多数对象都在多个集合中。要记住的一个关键事项是某些东西是否具有值语义(结构/值类型)或引用语义。当您将具有值语义的东西分配给其他东西时,就会制作副本。另一方面,如果您指定具有引用语义的内容,则只需使用别名

public struct Foo{
   public int x;
   public Foo(int x){
       this.x = x;
   }
}

//value semantics
Foo x = new Foo(1)
Foo y = x;

//reference semantics
object xx = new object();
object yy = xx

Object.ReferenceEquals(x,y); // <-- returns false;
Object.ReferenceEquals(xx,yY); // <-- returns true;

如果您不小心,那么在处理值类型时可能会遇到一些难以发现的错误,就像它们具有引用语义或反过来一样

 public class Baz {
     private Foo _myFoo = new Foo(1);
     public Foo MyFoo {
         get{
            return _myFoo;
         }
     }
 }

Foo bar = new Baz();
bar.MyFoo.x = 789; // <-- returning a copy of _myFoo not a reference to that object
if(barMyFoo.x == 1){
   Console.WriteLine("This will be written to console because bar.x is 1!");
}

答案 1 :(得分:1)

在OOP术语中,这些都是“类”。它们是否需要新的关键字,值类型机制等都是C#语言的实现细节,而不是OOP概念。在概念层面,是的,它们都是OO意义上的类。

在C#中,OOP术语“class”分为两类,普通类和结构。普通类被视为引用类型,而结构体被视为值类型(有关差异的讨论,请参阅here)。

您提到的原始类型(int,bool,char)是结构的别名。这基本上意味着幕后,编译器为您创建一个新的struct类型实例。例如,int是System.Int32的别名,因此您可以互换使用这两者。这又是一个实现细节 - 它并不意味着它们不是类,它只是意味着编译器正在尝试简化事情并使您的生活更轻松。

答案 2 :(得分:0)

在C#中我们有“价值类型”即。 int,double,decimal,enums,structs和“Reference types” - 这些是类。