【问题标题】:What are datatypes in terms of OOP in c# ??? Are they classes? [closed]c# 中 OOP 的数据类型是什么???有课吗? [关闭]
【发布时间】:2012-10-31 12:59:06
【问题描述】:

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

【问题讨论】:

  • 阅读the manual
  • 还有Types
  • 说真的,伙计们,我不能问一个困扰我的问题吗???我知道我的结构不够好,但我写了我遇到的问题......仅仅因为你们知道所有这些东西并不意味着你可以将初学者的问题标记为不清楚。这只是阻止我对编程的热爱的一种方式....感谢大家回答这个问题,无论对你们来说多么愚蠢或容易。
  • 问题不在于你的问题的想法很糟糕(这对我来说似乎足够合理),而是它太模糊了。您的问题的措辞方式并不能立即说明您在问什么,这也是它被关闭的主要原因。

标签: c# oop class object


【解决方案1】:

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

接口既不是类也不是结构/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!");
}

【讨论】:

  • 你解开了我的疑惑。谢谢兄弟
【解决方案2】:

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

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

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

【讨论】:

  • 所以你的意思是在 Objects 之后有两件事。引用类型和值类型。类是引用类型的细分???和值类型是完全不同的东西???
  • 是的,基本上。你必须小心“类”这个词。在 OO 术语中,类只是具有您创建实例的属性和行为的实体。您列出的所有内容都符合该定义,因此它们都是面向对象的类。在 C# 中,类分为引用类型和值类型。为了让事情变得混乱,他们将引用类型称为类,即使引用类型和值类型都符合类的 OO 定义。
  • 谢谢,这正是我想要的。
  • OO 没有类的概念,它本身就是 C# 实现细节(它与其他语言共享的细节)。这是面向对象而不是面向类。 JavaScript 是面向对象的(一种函数式的),在 JS 中没有 class 的概念。 SmallTalk 也是如此
  • @RuneFS 这不是真的。 OO 原则特别概述了类是什么的理论(参见en.wikipedia.org/wiki/Object-oriented_programming 或更正式的dl.acm.org/citation.cfm?id=547964&dl=ACM&coll=portal)。另外,JS 绝对不是面向对象的。
【解决方案3】:

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

【讨论】:

  • 也有两个都不是的接口
  • 如果接口是数据类型,则创建接口的实例;)
  • int、double 等都实现了接口,因此这些类型的对象可以通过接口类型看到。即任何 int 回答你的挑战
猜你喜欢
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 2021-11-08
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 2020-05-19
相关资源
最近更新 更多