ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:50.09KB ,
资源ID:18955605      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/18955605.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(可空类型 C#Word格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

可空类型 C#Word格式.docx

1、如果nullableInt是一个int类型的变量,上面的代码是不能编译的。前面的赋值等价于:nullableInt = new System.Nullable();与其他变量一样,无论是初始化为null(使用上面的语法),还是通过给它赋值来初始化,都不能在初始化之前使用它。可以像测试引用类型一样,测试可空类型,看看它们是否为null:if (nullableInt = null) .另外,可以使用HasValue属性:if (nullableInt.HasValue)这不适用于引用类型,即使引用类型有一个HasValue属性,也不能使用这种方法,因为引用类型的变量值为null,就表示不存在对象

2、,当然就不能通过对象来访问这个属性,此时会抛出一个异常。使用Value属性可以查看引用类型的值。如果HasValue是true,就说明Value属性有一个非空值。但如果HasValue是false,就说明变量被赋予了null,访问Value属性会抛出System. InvalidOperationException类型的异常。可空类型要注意的一点是,它们非常有用,以致于修改了C#语法。上面可空类型的变量不使用上述语法,而是使用下面的语法:int? nullableInt;int ?是System.Nullable的缩写,但可读性更高。在后面的章节中就使用这个语法。1. 运算符和可空类型对于简单

3、类型如int,可以使用+、等运算符来处理值。而对于可空类型,这是没有区别的:包含在可空类型中的值会隐式转换为需要的类型,使用适当的运算符。这也适用于结构和自己提供的运算符。 op1 = 5; result = op1 * 2;注意其中result变量的类型也是int?。下面的代码不会编译:int result = op1 * 2;为了使上面的代码正常工作,必须进行显式转换:int result = (int)op1 * 2;只要op1有一个值,上面的代码就可以正常运行,如果op1是null,就会生成System.Invalid OperationException类型的异常。这就引出了下一个问

4、题:当运算等式中的一个或两个值是null时,例如上面代码中的op1,会发生什么情况?答案是:对于除了bool?之外的所有简单可空类型,该操作的结果是null,可以把它解释为“不能计算”。对于结构,可以定义自己的运算符来处理这种情况(详见本章后面的内容)。对于bool?,为&和 | 定义的运算符会得到非空返回值,如表12-1所示。表 12-1op1op2op1 & op2op1 | op2truefalsenull这些运算符的结果与我们想像的一样,如果不需要知道其中一个操作数的值,就可以计算出结果,则该操作数是否为null就不重要。2. ?运算符为了进一步减少处理可空类型所需的代码量,使可空变量

5、的处理变得更简单,可以使用?运算符。这个运算符允许提供可空类型是null和不是null时的默认值,其用法如下: op1 = null;int result = op1 * 2 ? 5;在这个示例中,op1是null,所以op1*2也是null。但是,?运算符检测到这个情况,并把值5赋予result。这里特别要注意,在结果中放入int类型的变量result不需要显式转换。运算符会自动处理这个转换。可以把?等式的结果放在int?中: result = op1 * 2 ?在处理可空变量时,?运算符有许多用途,它也是提供默认值的一种方便方式,不需要使用if结构中的代码块。在下面的示例中,将介绍可空类型

6、Vector。试试看:可空类型(1) 在目录C:BegVCSharpChapter12下创建一个新控制台应用程序项目Ch12Ex01。(2) 使用VS快捷方式,在文件Vector.cs中添加一个新类Vector。(3) 修改Vector.cs中的代码,如下所示:public class Vector public double? R = null; Theta = null; ThetaRadians get / Convert degrees to radians. return (Theta * Math.PI / 180.0); public Vector(double? r, doub

7、le? theta) / Normalize. if (r 0) r = -r; theta += 180; theta = theta % 360; / Assign fields. R = r; Theta = theta; public static Vector operator +(Vector op1, Vector op2) try / Get (x, y) coordinates for new vector. double newX = op1.R.Value * Math.Sin(op1.ThetaRadians.Value) + op2.R.Value * Math.Si

8、n(op2.ThetaRadians.Value); double newY = op1.R.Value * Math.Cos(op1.ThetaRadians.Value) + op2.R.Value * Math.Cos(op2.ThetaRadians.Value); / Convert to (r, theta). double newR = Math.Sqrt(newX * newX + newY * newY); double newTheta = Math.Atan2(newX, newY) * 180.0 / Math.PI; / Return result. return n

9、ew Vector(newR, newTheta); catch / Return null vector. return new Vector(null, null); public static Vector operator -(Vector op1) return new Vector(-op1.R, op1.Theta); public static Vector operator -(Vector op1, Vector op2) return op1 + (-op2); public override string ToString() / Get string represen

10、tation of coordinates. string rString = R.HasValue ? R.ToString() : ; string thetaString = Theta.HasValue ? Theta.ToString() : / Return (r, theta) string. return string.Format(0, 1), rString, thetaString);(4) 修改Program.cs中的代码,如下所示:class Program public static void Main(string args) Vector v1 = GetVec

11、tor(vector1); Vector v2 = GetVector( Console.WriteLine(0 + 1 = 2, v1, v2, v1 + v2);0 - 1 = 2, v1, v2, v1 - v2); Console.ReadKey(); public static Vector GetVector(string name)Input 0 magnitude:, name); double? r = GetNullableDouble();Input 0 angle (in degrees): theta = GetNullableDouble(); return new

12、 Vector(r, theta); public static double? GetNullableDouble() result; string userInput = Console.ReadLine(); result = double.Parse(userInput); result = null; return result;(5) 执行应用程序,给两个矢量(vector)输入值,结果如图12-1所示。图 12-1(6) 再次执行应用程序,这次跳过四个值中的至少一个,结果如图12-2所示。图 12-2示例的说明在这个示例中,创建了一个类Vector,它表示带极坐标(有一个幅值和一

13、个角度)的矢量,如图12-3所示。图 12-3坐标r和_在代码中用公共字段R和Theta表示,其中Theta的单位是度()。ThetaRad用于获取Theta的弧度值,这是必须的,因为Math类在其静态方法中使用弧度。R和Theta的类型都是double?,所以它们可以为空。Vector的构造函数标准化R和Theta的初始值,然后赋予公共字段。Vector类的主要功能是使用运算符重载对矢量进行相加和相减,这需要一些非常基本的三角函数知识,这里不解释它们。在代码中,重要的是,如果在获取R或ThetaRad的Value属性时抛出了异常,即其中一个是null,就返回“空”矢量。如果组成矢量的坐标是null,该矢量就是无效的,这里用R和Theta都可为null的Vector类来表示。Vector类的其他代码重写了其他运算符,把相加的功能扩展到相减上,再重写ToString(),获取Vector对象的字符串表示。Program.cs中的代码测试Vector类,让用户初始化两个矢量,再对它们进行相加和相减。如果用户省略了一个值,该值就解释为null,应用前面提及的规则。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1