私が作成するすべてのクラスは、それをインスタンス化するためにNEWキーワードを必要とします。それでは、Oledbconnectionはクラスなのだろうか(新しいキーワードが必要なため)??? もしそうなら、int、bool、charもクラスですか?自分のコンセプトをクリアする必要があります。
3 に答える
.NETのほとんどの型は、クラスであるオブジェクトから派生します。したがって、これらはすべてクラスであると言えますが、それらの一部は、参照型とは異なる動作をするValueTypeから派生しています。そして、参照型は、ほとんどの人がクラスについて話すときに参照するものです。その点で、int、bool、その他の(その他の)構造体などの値型はクラスではありません。
インターフェイスはクラスでも構造体/ValueTypeでもありません。インターフェイスです。
int x = 0; // 0で表されるオブジェクトは、ValueType x.ToString();であるint型です。// ToStringは、クラス(IComparable)x).CompareTo(1);である基本型Objectによって実装されます。//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!");
}
OOP用語では、これらはすべて「クラス」です。新しいキーワードや値型の仕組みなどが必要かどうかは、すべてC#言語の実装の詳細であり、OOPの概念ではありません。概念レベルでは、はい、それらはすべてOOの意味でのクラスです。
C#では、OOP用語「クラス」は、通常のクラスと構造体の2つのタイプに分けられます。通常のクラスは参照型として扱われ、構造体は値型として扱われます(違いの説明については、ここを参照してください)。
あなたが言及するプリミティブ型(int、bool、char)は、構造体のエイリアスです。これは基本的に舞台裏を意味し、コンパイラは構造体型の新しいインスタンスを作成します。たとえば、intはSystem.Int32のエイリアスであるため、この2つを同じ意味で使用できます。これも実装の詳細です。クラスではないという意味ではなく、コンパイラが物事を単純化し、作業を楽にしようとしていることを意味します。
C#には、「値型」があります。int、double、decimal、enums、structs、および「参照型」-これらはクラスです。