-1

我创建的每个类都需要 NEW 关键字来实例化它。我想知道 Oledbconnection 是一个类(因为它需要一个新的关键字)???如果是,那么是 int、bool、char 也是类???我只需要理清我的概念。

4

3 回答 3

2

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

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

诠释 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!");
}
于 2012-10-31T13:06:45.147 回答
1

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

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

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

于 2012-10-31T13:08:55.190 回答
0

在 C# 中,我们有“值类型”,即。int、double、decimal、枚举、结构和“引用类型”——这些都是类。

于 2012-10-31T13:05:07.530 回答