编写高质量的代码,改善c#程序的157个建议_之1~10

//编写高质量的代码,改善c#程序的157个建议
# 1、正确操作字符串
## 1
* 确保尽量少的装箱
* 避免分配额外的内存空间

1. 会进行一次装箱
````C#
string str1="str1"+9;
````
2. 没有装箱,调用的是整型的ToString方法
````C#
string str2="str2"+9.ToString();
````

# 2、使用默认转换类型
* 使用类型的转换运算符
* 使用类型内置的Parse、TryParse,或者如ToString、ToDouble和ToDataTime等方法
* 使用帮助类提供的方法
* 使用CLR支持的转型

## 1、使用类型转换运算符
使用类型内部的一个方法:隐式转换和显式转换,用户自定义的类型通过重载运算符提供这一类转换。
## 2、使用类型内置的Parse、TryParse,或者如ToString、ToDouble和ToDataTime等方法
在FCL中,如果某个类型经常需要进行转型操作,类型自身则会带有一些转型方法。
## 3、使用帮助类提供的方法
可以使用如System.Convert类、System.Converter类来进行类型转换。
## 4、使用CLR支持的转型
CLR支持的转型,即上溯转型和下溯转型。基类和子类之间的转换

# 3、区别对待强制转型与as和is
````C#
secondType=(SencondType)firstType;
````
强制转型意味着两件不同的事情:
* 1> firstType和SencondType彼此依靠转换操作符来完成两个类型之间的转型
如果类型之间都上溯到了某个共同的基类,那么根据此基类进行的转(即基类转型为子类本身)应该使用as。子类与子类之间的转型,则应该提供转换操作符,以进行强制转型。
````C#
//对比两种类型
class FirstType
{
public string Nmae{get;set;}
}
class SecondType
{
public string Name{get;set;}
public static explicit operator SecondType(FirstType firstType)
{
SecondType secondType=new SecondType(){Name="转型自:" + firstType};
return secondType;
}
}
//使用过程
static void DoWithSomeType(object obj)
{
SecondType secondType=(SecondType)obj;//参数是firstType会引发异常

SecondType secondType= obj as SecondType;//这个时候输入的参数可以是firstType!
if(secondType!=null)
{
//ToDo
}
}
````
* 2> FirstType是SencondType的基类
既可以使用强制转型,也可以使用as操作符;建议使用as操作符
````C#
class Program
{
static void Main(string[] args)
{
SecondType secondType=new SecondType(){Name="Second Type"};
FirstType firstType1=(FirstType)secondType;
FirstType firstType1=secondType as FirstType;
}
}
class FirstType
{
public string Name{get;set;}
}
class SecondType:FirstType
{
}
//另一种版本
if (obj is SecondType)
{
SecondType secondType=obj as SecondType;
//ToDo
}
````

# 4、TyParse比Parse好
如果转换的结果是对的,那么这两种的效率在相同的数量级;如果转换失败前者效率比后者高很多!
# 5、使用int?来确保值类型也可以为null
语法T?是Nullable<T>的简写,两者可以相互转换。可以为null的类型表示其基础值类型正常范围内的值再加上一个null值。例如,Nullable<Int32>,其值的范围为-2147483648~2147483647,再加上一个null值。
* 基元类型提供了其对应的可空类型的隐式转换
````C#
int? i=null;
int j=0;
i=j;
````
* 反过来,可空类型不可隐式转换为对应的基元类型
````C#
int? i=123;
int j;
//繁琐的代码
if(i.HasValue)
{
j=i.Value;
}
else
{
j=0;
}
//简化的代码
int? i=123;
int j=i??0;
````

# 6、区别readonly和const的使用方法

* >const是一个编译期常量,readonly是一个运行时常量。
### 1>对于值类型变量,值本身不可改变。
### 2>对于引用类型变量,引用本身(相当于指针)不可改变。
````C#
/*****值类型变量*****/
calss Sample
{
public readonly int ReadOnlyValue;
public Sample(int value)
{
readOnlyValue=value;
}
}
//Sample的实例在构造方法中被赋值后就不可以改变
Sample sample=new Sample(200);
sample.ReadOnlyValue=300;
/*******引用类型变量*****/
class Sample2
{
public readonly Student ReadOnlyValue;
public Sample2(Student value)
{
ReadOnlyValue=value;
}
}
//赋值后,变量不能再指向任何其他的Student实例
Sample2 sample2=new Sample2(new Student(){Age=10});
sample2.ReadOnlyValue=new Student(){Age=20};
//引用本身不可改变,引用所指实例的值却可以改变
sample2=new Sample2(new Student(){Age=10});
sample2.ReadOnlyValue.Age=20;
````
* >const只能修饰基元类型、枚举类型或者字符串类型,readonly没有限制。

# 7&8、将0值作为枚举的默认值&避免给枚举类型的元素提供显式的值
允许使用的枚举类型有byte、sbyte、short、ushort、int、uint、long和ulong。始终将0值作为枚举类型的默认值。
````C#
//应该将显示为元素的赋值去掉,编译器会自动从0值开始计数,然后逐个为元素的值+1
enum Week
{
Monday=1,
Tuesday=2,
Wednesday=3,
Thursday=4,
Friday=5,
Saturday=6,
Sunday=7
}
//枚举元素允许设定重复得值
enum Week
{
Monday=1,
Tuesday=2,
ValueTemp,
Wednesday=3,
Thursday=4,
Friday=5,
Saturday=6,
Sunday=7
}
//下边代码输出为:Wednesday
Week week=Week.ValueTemp;
Console.WriteLine(week);//上一个枚举值加一
````






转载于:https://www.cnblogs.com/mengwy/p/11371032.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361456.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue中使用Ueditor编辑器 -- 1

一、 下载包&#xff1a; 从Ueditor的官网下载1.4.3.3jsp版本的Ueditor编辑器&#xff0c;官网地址为&#xff1a;http://ueditor.baidu.com/website/download.html 下载解压后会得到如果下文件目录&#xff1a; 将上述Ueditor文件夹拷贝到vue项目的static文件夹中&#xff0…

编译原理--递归下降分析实验C++

一、实验项目要求 1.实验目的 根据某一文法编制调试递归下降分析程序&#xff0c;以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 2.实验要求 对下列文法&#xff0c;用递归下降分析法对任意输入的符号串进行分析&#xff1a; &#…

浅析路径遍历漏洞 文/饭

许多的Web应用程序一般会有对服务器的文件读取查看的功能&#xff0c;大多会用到提交的参数来指明文件名&#xff0c;形如&#xff1a;http://www.nuanyue.com/getfileimage.jgp 当服务器处理传送过来的image.jpg文件名后&#xff0c;Web应用程序即会自动添加完整路径&#xff…

摆脱困境:在DbUnit数据集中使用空值

如果我们正在为使用Spring Framework的应用程序编写集成测试&#xff0c;则可以通过使用Spring Test DbUnit将DbUnit与Spring测试框架集成。 但是&#xff0c; 这种集成并非没有问题 。 通常&#xff0c;我们必须在运行测试之前向数据库中插入空值&#xff0c;或者验证保存到…

artdialog5 bug

1.使用artdialog5时&#xff0c;使用两个输入框传值&#xff0c;一直无法取到值&#xff0c;使用简单的ID无法取到值&#xff0c;如idbranch..改为idbranch_str_dialog就可以了&#xff0c;问题是解决了&#xff0c;可是没有找到原因所在&#xff01; 转载于:https://www.cnblo…

vue中通过js控制页面样式方法

在使用vue.js框架的时候&#xff0c;有时候会希望在页面渲染完成之后&#xff0c;再执行函数方法来处理初始化相关的操作&#xff0c;如果只处理页面位置、宽或者高时&#xff0c;必须要在页面完全渲染之后才可以&#xff0c;页面没有加载完成之前&#xff0c;获取到的宽高不准…

Memcached入门指南

1 概览 Memcached是一个免费开源&#xff0c;高性能的&#xff0c;分布式内存对象缓存系统&#xff0c;为了加快动态web应用程序&#xff0c;减轻数据库负载。 Memcached是一个内存中的基于键/值存储任意数据小片段&#xff08;字符&#xff0c;对象&#xff09;&#xff0c;存…

css正則匹配、模糊匹配

//所有class包含font-red的p标签 p[class~"font-red"] {color: red;} [abc^"def"] 选择 abc 属性值以 "def" 开头的所有元素 [abc$"def"] 选择 abc 属性值以 "def" 结尾的所有元素 [abc*"def"] 选择 abc 属性值中…

快速指南:剖析JBoss BPM跨进程通信

&#xff08;文章来宾与北美红帽公司高级解决方案架构师杰伊保拉杰共同撰写&#xff09; 几周的提示与技巧文章将深入探讨JBoss BPM Suite&#xff0c;特别是有关如何在两个流程之间进行通信的问题。 在进入解决方案详细信息之前&#xff0c;让我们首先约束将要讨论的用例。 …

字符串中全角半角之间的转换

前几天&#xff0c;在做表单验证的时候&#xff0c;发现用户在输入表单内容的时候&#xff0c;正常情况下都是半角输入&#xff0c;但是也有可能是全角输入&#xff0c;所以就牵扯到全角输入内容的验证&#xff0c;这里便提供全角和半角之间的转换函数&#xff0c;与大家分享一…

Android HAL 层,三个重要的结构体的源码~

最近在学习android HAL 层 ~ 离不开这三个数据结构~~先贴出来 typedef struct hw_module_t { /** tag must be initialized to HARDWARE_MODULE_TAG */ uint32_t tag; /** major version number for the module */ uint16_t version_major; /** minor version number …

React使用的扩展

待续。。。 转载于:https://www.cnblogs.com/wenxuehai/p/11387188.html

使用命令行工具创建WildFly OpenShift应用程序

通过使用快速入门&#xff0c;可以在OpenShift上轻松配置WildFly的新实例。 只需单击一下&#xff0c;您就可以准备就绪&#xff01; 通常&#xff0c;OpenShift的高级用户使用命令行工具 。 但是&#xff0c;您无法使用CLI工具创建WildFly墨盒。 但现在已解决错误1134134 。 …

word-break属性和css换行显示

这几天在做项目的时候&#xff0c;遇到了比较棘手的问题&#xff0c;便是在一个标签里边展示内容&#xff0c;如果说展示中文汉字&#xff0c;一点问题都没有&#xff0c;但是只要连续展示英文字母或者中文的标点符号&#xff08;中间不带空格&#xff09;&#xff0c;那么所渲…

第四种行转列

--动态处理 select A.StuName,A.BZKTypeName,cast(A.BKCODE as varbinary(MAX)) even, row_number() over (partition by StuName,BZKTypeName order by getdate()) ID into #t1 from BKLIST A --where StuName林健辉 declare sql1 varchar(max) declare sql2…

React-router的基本使用

1、安装使用 $ npm install -S react-router import { Router, Route, hashHistory } from react-router;render((<Router history{hashHistory}><Route path"/" component{App}/></Router> ), document.getElementById(app)); 1.1、版本问题 reac…

使用反应流API将Akka流与rxJava结合在一起

这次只是一篇简短的文章&#xff0c;因为我仍在尝试这种东西。 关于反应式编程有很多话题。 在Java 8中&#xff0c;我们有Stream API&#xff0c;我们有rxJava我们有ratpack &#xff0c;Akka有akka-streams 。 这些实现的主要问题是它们不兼容。 您不能将一个实现的订阅者连…

九宫格有规律高亮滚动效果

前几天朋友去面试&#xff0c;面试官要求当场用九宫格写出一个滚动有规律的大转盘滚动高亮效果&#xff0c;结果可想而知。如下图&#xff1a; 也就是说当页面刚进来的时候&#xff0c;红色方块在左上角&#xff0c;接下来按照图上所标注的箭头方向来依次循环。当我听说了这个面…

[源码学习]调试Razor从哪里开始

使用ASP.NET MVC时&#xff0c;我们知道&#xff0c;要使用Views中的视图&#xff0c;需要在Action中写 return View(); 这个方法返回的返回值是一个 ViewResult&#xff0c;进入这个类&#xff0c;继承了父类ViewResultBase后只写了MasterName属性和FindView方法。 不过已经开…

使用Maven原型高效创建Eclipse模块

Maven Archetype是一个项目模板工具包&#xff0c;可为开发人员提供生成内置或自定义脚手架工件的参数化版本的方法。 最近&#xff0c;我将其应用于我们的Xiliary P2存储库&#xff0c;以实现Eclipse模块存根创建的自动化。 由于效果很好&#xff0c;所以我认为值得在这篇文章…