给引用类型的值类型字段赋值需要装箱吗?

C#编程中,大家会经常使用到不同的数据类型,那么C#编程语言到底有什么类型呢?具体如下:

各种值类型总是含有相应该类型的一个值。C#迫使你初始化变量才能使用它们进行计算-变量没有初始化不会出问题,因为当你企图使用它们时,编译器会告诉你。 每当把一个值赋给一个值类型时,该值实际上被拷贝了。相比,对于引用类型,仅是引用被拷贝了,而实际的值仍然保留在相同的内存位置,但现在有两个对象指向了它(引用它)。C#的值类型可以归类如下:

系统类型的别名。第二,由简单类型组成的常量表达式仅在编译时而不是运行时受检测。最后,简单类型可以按字面被初始化。以下为C#简单类型归类:

  • 字符型 (整型的一种特殊情况)
  • sbyte型为有符号8位整数,取值范围在128~127之间。
  • bytet型为无符号16位整数,取值范围在0~255之间。
  • ushort型为无符号16位整数,取值范围在0~65,535之间。

VB和C程序员都可能会对int和long数据类型所代表的新范围感到惊讶。和其它的编程语言相比,在C#中,int不再取决于一个机器的字(word)的大小,而long被设成64位。

布尔数据类型有true和false两个布尔值。可以赋于true或false值给一个布尔变量,或可以赋于一个表达式,其所求出的值等于两者之一:


 

与C和C++相比,在C#中,true值不再为任何非零值。不要为了增加方便而把其它整型转换成布尔型。

字符型为一个单Unicode 字符。一个Unicode字符16位长,它可以用来表示世界上多种语言。可以按以下方法给一个字符变量赋值:


 

除此之外,可以通过十六进制转义符(前缀\x)或Unicode表示法给变量赋值(前缀\u):


 

不存在把char转换成其它数据类型的隐式转换。这就意味着,在C#中把一个字符变量当作另外的整数数据类型看待是行不通的——这是C程序员必须改变习惯的另一个方面。但是,可以运用显式转换:


 

在C中仍然存在着转义符(字符含义)。要换换脑筋,请看表4.1。

两种数据类型被当作浮点型:float和double。它们的差别在于取值范围和精度:

当用两种浮点型执行运算时,可以产生以下的值:

另一个运算规则为,当表达式中的一个值是浮点型时,所有其它的类型都要被转换成浮点型才能执行运算。

小数型是一种高精度、128位数据类型,它打算用于金融和货币的计算。它所表示的范围从大约1.0x10^-28 到 7.9x10^28,具有28至29位有效数字。要注意,精度是以位数 (digits)而不是以小数位(decimal places)表示。运算准确到28个小数位的最大值。

正如你所看到的,它的取值范围比double的还窄,但它更精确。因此,没有decimal和double之间的隐式转换——往一个方向转换可能会溢出,往另外一个方向可能会丢失精度。你不得不运用显式转换。

当定义一个变量并赋值给它时,使用 m 后缀以表明它是一个小数型:


 

如果省略了m,在变量被赋值之前,它将被编译器认作double型。

一个结构类型可以声明构造函数、常数、字段、方法、属性、索引、操作符和嵌套类型。尽管列出来的功能看起来象一个成熟的类,但在C#中,结构和类的区别在于结构是一个值类型,而类是一个引用类型。与C++相比,这里可以用结构关键字定义一个类。

使用结构的主要思想是用于创建小型的对象,如Point和FileInfo等等。你可以节省内存,因为没有如类对象所需的那样有额外的引用产生。例如,当声明含有成千上万个对象的数组时,这会引起极大的差异。

清单4.1 包含一个命名为IP的简单结构,它表示一个使用byte类型的4个字段的IP地址。我不包括方法等,因为这些工作正如使用类一样,将在下一章有详细的描述。

清单1.1 定义一个简单的结构


 

当你想声明一个由一指定常量集合组成的独特类型时,枚举类型正是你要寻觅的。最简单的形式,它看起来可能象这样:


 

因我惯用缺省设置,故枚举元素是int型,且第一个元素为0值。每一个连续的元素按1递增。如果你想给第一个元素直接赋值,可以如下把它设成1:


 

如果你想赋任意值给每个元素——甚至相同的值——这也没有问题:


 

最后的选择是不同于int的数据类型。可以在一条语句中按如此赋值:


 

和值类型相比,引用类型不存储它们所代表的实际数据,但它们存储实际数据的引用。在C#中提供以下引用类型给你使用:

对象类型是所有类型之母——它是其它类型最根本的基类。因为它是所有对象的基类,所以可把任何类型的值赋给它。例如,一个整型:


 

给所有的C++程序员一个警告:object并不等价于你可能正在寻找的void*。无论如何,忘掉指针总是个好主意。

当一个值类型被加框(作为一个对象利用)时,对象类型就被使用了。这一章稍后会讨论到加框和消框

一个类类型可以包含数据成员、函数成员和嵌套类型。数据成员是常量、字段和事件。函数成员包括方法、属性、索引、操作符、构造函数和析构函数。类和结构的功能是非常相似的,但正如前面所述,结构是值类型而类是引用类型。

1、 变量命名的规则有哪些?

2、写出所有的值类型和引用类型?

答: 1、值类型:13中基本数据类型、结构体、枚举; 

3、ref参数和out参数是什么?有什么区别?

答:1、ref为引用参数,后面参数的类型为值类型,当把形参值修改后,实参的值也相应的进行修改,使其具有引用类型的性质,但在传实参时,实参必须先赋值;

2、out参数为输出参数,是从方法内部向外部进行传,即把形参传递给实参,方法参数中可以有多个out修饰的参数,形参传递值给实参时要先赋值,而实参可以不用赋值,out参数解决了一个方法不能返回多个返回值的缺陷。 

4、结构体和类有何区别?

答:1、语法上的区别:定义类是使用关键字Class,而定义结构体时使用关键字Struct

2、结构体中不可对声明字段进行初始化,但是类可以

3、如果没有为类定义构造函数,C#编译器会自动生成一个无参数的实例构造函数,即隐式构造函数,但是如果我们为类显式地定义了一个构造函数,C#编译器就不会再生成隐式构造函数了;而结构体中,不论你是否显式地定义了构造函数,隐式构造函数都是一直存在的

4、类是引用类型,而结构体是是值类型

5、结构体不能定义析构函数,而类可以有析构函数

6、不能用Abstract(抽象)和Sealed(密封)关键字修饰结构体,但是类可以

1、类中静态字段与非静态字段有什么区别?

答:加static修饰字段时,则该字段为静态字段,静态字段不属于某个实例对象,只与类型相关联,对静态字段的访问只与类型关联,访问时使用类型.字段,实例字段的访问与实例对象关联,访问时使用对象名.字段。 

2、面向对象的思想的三个基本特征?分别描述一下定义?

答:封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部。

继承:子类拥有父类的所有数据和操作。

多态:同一种方法作用于不同对象可以产生不同的结果 

3、简述抽象方法和虚方法的区别?

4、类中构造方法的作用是?简述构造方法的特点?

答:作用:负责开辟内存空间,初始化对象

1.构造方法的方法名必须和类名一致

2.构造方法没有返回值,不需要写void

3.构造方法能够添加参数

5.如果没有给类添加构造方法,系统会提供一个默认的构造,也就是只开辟空间

6.如果将某个构造方法设为私有的,就不允许再通过这个构造创建对象

1、什么是装箱和拆箱? (2分)

    从值类型接口转换到引用类型装箱。从引用类型转换到值类型拆箱

    重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要; 

3、C#有几种表达式?根据什么确定表达式的类型?(2分)

在C#中,基本表达式有5种:算术表达式、关系表达式、逻辑表达式、条件表达式和赋值表达式.表达式的类型由运算符的类型决定

4、简述类和结构体的区别(3分)

类的声明和结构体的声明非常类似,只是限定符后面是 struct 还是 class 的区别,而且使用时,定义新的结构体和定义新的类的方法也非常类似。类和结构体的具体区别为:(1)结构体是值类型,类是引用类型。(2)结构体不能从另外一个结构体或者类继承,本身也不能被继承,而类是完全可扩展的,自身也能被继承。(3)结构体没有默认的构造函数,但是可以添加构造函数,没有析构函数;类有默认的构造函数,也有析构函数

5、抽象类和接口的区别(3分)

1. 一个类只能继承一个抽象类,但可以同时继承多个接口;

2. 抽象类里面可以有字段,接口里面不能有字段;

3. 抽象类里面可以有私有成员,接口里面所有的成员都是公有的;

4. 抽象类的成员可以带或者不带访问修饰符,接口里面一定不带访问修饰符;

5. 一个子类继承抽象类时需重写里面的抽象方法,当子类是抽象类时可以不用重写,而继承接口时一定要实现接口里面的成员;

6、简述抽象方法和虚方法的区别 (3分)

   * 使用场景:当多个类具有多个相同的字段和方法时,可以将公共的部分定义成父类,供其他类去继承,这样子类中就不用重复添加这些相同的字段和方法

   * 继承的优势:省代码,增强程序的可扩展性,可修改性,可复用性

 * 如果创建类的时候,没有指定基类,这时,该类默认是继承自Object类(根类)

如果你的简历上面写“熟悉/了解C#”,那么你就应该能够回答下面的这些基础问题。我将给出自己的简要答案以供参考。欢迎讨论。
1. 传入某个属性的set方法的隐含参数的名称是什么?
value,它的类型和属性所声名的类型相同。
2. 如何在C#中实现继承?
在类名后加上一个冒号,再加上基类的名称。
3. C#支持多重继承么?
不支持。可以用接口来实现。
4. 被protected修饰的属性/方法在何处可以访问?
在继承或间接继承与这个类的子类中可以访问。
5. 私有成员会被继承么?
会,但是不能被访问。所以看上去他们似乎是不能被继承的,但实际上确实被继承了。
被protected internal修饰的属性/方法只能在它的在同一个程序集(Assembly)中的子类被访问。
7. C#提供一个默认的无参数构造函数,当我实现了另外一个有一个参数的构造函数时候,还想保留这个无参数的构造函数。这样我应该写几个构造函数?
两个,一旦你实现了一个构造函数,C#就不会再提供默认的构造函数了,所以需要手动实现那个无参数构造函数。
8. C#中所有对象共同的基类是什么?
9. 重载和覆写有什么区别?
重载提供了对一个方法签名的不同参数调用的实现。覆写提供了子类中改变父类方法行为的实现。
10. 在方法定义中,virtual有什么含意?
被virtual修饰的方法可以被子类覆写。
11. 能够将非静态的方法覆写成静态方法么?
不能,覆写方法的签名必须与被覆写方法的签名保持一致,除了将virtual改为override。
12. 可以覆写私有的虚方法么?
不可以,甚至子类中无法访问父类中的私有方法。
13. 能够阻止某一个类被其他类继承么?
可以,使用关键字sealed。
14. 能够实现允许某个类被继承,但不允许其中的某个方法被覆写么?
可以,标记这个类为public,并标记这个方法为sealed。
一种不可以被实例化的类。抽象类中一般含有抽象方法,当然也可有具体实现。继承类只有实现过所有抽象类的抽象方法后才能被实例化。
16. 何时必须声明一个类为抽象类?
当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时。
只含有共有抽象方法(public abstract method)的类。这些方法必须在子类中被实现。

19. 为什么不能指定接口中方法的修饰符?
接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。他们默认为公有方法。
20. 可以继承多个接口么?

我要回帖

更多关于 引用赋值和直接赋值 的文章

 

随机推荐