C#基础知识系列一(goto、i++、三元运算符、ref和out、String和string、重载运算符)
前言
这两天在网上看到的总结很多,尤其是博客园中的,很多很多,也给了我很多的启发,当然自己也总结过,而且有很多人也给与我一些意见和看法。不管怎样,自己还是先把所谓的基础知识加强巩固下吧。
2014年的第一篇博客,希望自己从基础开始。也是希望自己能够稍微系统来学习整合一下。因为之前从来都没系统学习过,都是用到啥查啥,先查啥就忘啥快,所以在此记录一下,以备以后查看。好了废话也不多说,进入正题。
正文
1、类和对象
类的定义:具有相同属性和功能的对象的抽象的集合。——脑门一闪,类其实也是个集合吗?
类的实例:实例化就是创建对象的过程,使用new关键字来创建。
来看以下代码,最简单的,你肯定懂:
public class Cat
{
public string Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
Cat cat = new Cat();
}
}
就是这句:Cat cat=new Cat();其实它做了两件事情,不知道你们知道不,我是现在才又知道的(原来肯定知道过,不过早已抛在千里之外了):
2、goto:语句将程序控制直接传递给标记语句。
goto貌似在开发中从来没用过。
static void Main(string[] args)
{
int i = ;
repeat: // the label
Console.WriteLine("i: {0}", i);
i++;
if (i < )
goto repeat; // the dastardly deed Console.ReadLine();
}
这是一个简单的用法满足条件的时候,跳转到标记repeat;
输出结果:
这有一篇关于goto的详细介绍:包括它的优缺点,应用场景。
http://www.cnblogs.com/IT-Bear/archive/2012/03/05/2380389.html
3、continue、break、return:C#编程语法中我们会经常碰到break ,continue, return这三个常用的关键字
break语句会使运行的程序立刻退出包含在最内层的循环或者退出一个switch语句。由于它是用来退出循环或者switch语句,所以只有当它出现在这些语句时,这种形式的break语句才是合法的。
如果一个循环的终止条件非常复杂,那么使用break语句来实现某些条件比用一个循环表达式来表达所有的条件容易得多。
for (var i = ; i <= ; i++)
{
if (i == ) break;
Console.WriteLine(i);
} //输出结果:12345
continue语句和break语句相似。所不同的是,它不是退出一个循环,而是开始循环的一次新迭代。
continue语句只能用在while语句、do/while语句、for语句、或者for/in语句的循环体内,在其它地方使用都会引起错误!
for (var i = ; i <= ; i++)
{
if (i == ) continue;
Console.WriteLine(i);
}
//输出结果:1234578910
return语句就是用于指定函数返回的值。return语句只能出现在函数体内,出现在代码中的其他任何地方都会造成语法错误!
当执行return语句时,即使函数主体中还有其他语句,函数执行也会停止!
4、i++和++i,前者先用后加,后者先加后用
这个在学校学的时候就感觉好别扭,现在好久没看了又模糊了。可能这也是面试的时候很多公司愿意出的问题吧。
static void Main(string[] args)
{
int valueOne = ;
int valueTwo;
valueTwo = valueOne++;
Console.WriteLine("After postfix: {0}, {1}", valueOne,
valueTwo);
valueOne = ;
valueTwo = ++valueOne;
Console.WriteLine("After prefix: {0}, {1}", valueOne,
valueTwo);
Console.ReadLine();
}
再来看一个简单的小例子:
int k = ;
int i = ;
k = ++i + (i++);
Console.WriteLine("k={0},i={1}", k, i);
先来看如果i=3; return i++; 那么返回的是3;如果return ++i;那么返回的是4。
所以 ++i 现在i=4;表达式变为4+(4++),而4++是先用了再加 所以就是8++,而8++同理先返回8,i再++,i就为5。
当然此题解法可能不止一种,如果你有兴趣可以一起来探讨一下。
5、switch中的case可以这样写
static void Main(string[] args)
{
const int Democrat = ;
const int LiberalRepublican = ;
const int Republican = ; int myChoice = LiberalRepublican; switch (myChoice)
{
case Democrat:
Console.WriteLine("You voted Democratic.\n");
break;
case LiberalRepublican:
case Republican:
Console.WriteLine("You voted Republican.\n");
break;
default:
Console.WriteLine("You did not pick a valid choice.\n");
break;
}
Console.ReadLine();
}
case LiberalRepublican:
case Republican:
符合这两个条件都会执行:
Console.WriteLine("You voted Republican.\n");
6、三元运算符相当于if else
static void Main( string[] args )
{
int valueOne = ;
int valueTwo = ;
int maxValue = valueOne > valueTwo ? valueOne : valueTwo; Console.WriteLine( "ValueOne: {0}, valueTwo: {1}, maxValue: {2}",
valueOne, valueTwo, maxValue );
}
int maxValue = valueOne > valueTwo ? valueOne : valueTwo;
这一句等同于一个if else
if (valueOne > valueTwo)
{
maxValue = valueOne;
}
else
{
maxValue = valueTwo;
}
7、ref和out:两者都是按地址传递的,使用后都将改变原来参数的数值
rel可以把参数的数值传递进函数,但是out是要把参数清空,就是说你无法把一个数值从out传递进去的,out进去后,参数的数值为空,所以你必须初始化一次。这个就是两个的区别,或者说就像有的网友说的,rel是有进有出,out是只出不进。
先来看一下ref:其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
示例:
static void Method(ref int i)
{
i = ;
} static void Main(string[] args)
{
int val = ;
Method(ref val);
Console.WriteLine(val); // val is now 44
Console.ReadLine();
}
传递到 ref 参数的参数必须最先初始化。这与 out 不同,后者的参数在传递之前不需要显式初始化。
再来看一下out:out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。
示例:
static void Method(out int i)
{
i = ;
} static void Main(string[] args)
{
int val;
Method(out val);
Console.WriteLine(val); // val is now 44
Console.ReadLine();
}
尽管作为 out 参数传递的变量不必在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值。
ref 和 out 关键字在运行时的处理方式不同,但在编译时的处理方式相同。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的,因此将不会编译以下代码:
但是,如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两类参数,则可以进行重载,如下所示:
public void SampleMethod( int i) { } public void SampleMethod(ref int i) { }
这样两个方法编译是可以成功的。
8、String和string,之前几乎没区分过这两个,不过还是要注意一下。
在C#中,string 是 System.String 的别名,所以基本上在使用时是没有差别的。习惯上,我们把字符串当作对象时(有值的对象实体),我们用string。
而我们把它当类时(需要字符串类中定义的方法),我们用String,比如:string greet = String.Format("Hello {0}!", place)。
其实乱用也可以,只是这样概念上清楚一点。
另外string是C#保留字,不可用作变量名,String就不是了。 String 必须先引用 System命名空间。
也可以这样理解:string是C#中字符串类型String的反射,一种简化的书写方式,就像int对应于Int32一样,二者在C#中可通用。
再则String是一个类,string是一种数据类型。string是c#中的类,String是.net Framework的类(在c# IDE中不会显示蓝色)
c# string映射为.net Framework的String。如果用string,编译器会把它编译成String,所以如果直接用String就可以让编译器少做一点点工作。
9、重载运算符
先来看几行简单的代码:
static void Main(string[] args)
{
int x = ;
int y = ;
int sum = x + y;
Console.WriteLine(sum);
Console.ReadLine();
}
一个int sum=x+y; 加法运算。
稍微封装一下:
static void Main(string[] args)
{
int x = ;
int y = ;
int sum = Add(x, y);
Console.WriteLine(sum);
}
static int Add(int x, int y)
{
return x + y;
}
如果现在有一个类,需要得知两个类某个属性的和,我们可能会这样:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
this.Name = name;
this.Age = age;
}
}
class Program
{
static void Main(string[] args)
{
Person p1 = new Person("aehyok", );
Person p2 = new Person("Leo", );
int sum = Add(p1.Age, p2.Age);
Console.WriteLine(sum);
}
static int Add(int x, int y)
{
return x + y;
}
}
我们再来改动一下:
class Program
{
static void Main(string[] args)
{
Person p1 = new Person("aehyok", );
Person p2 = new Person("Leo", );
int sum = p1 + p2;
Console.WriteLine(sum);
}
} public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public Person(string name, int age)
{
this.Name = name;
this.Age = age;
} public static int operator +(Person p1,Person p2)
{
return p1.Age+p2.Age;
}
}
总结
感觉自己的基础有点一塌糊涂吧,好好的补一下。这样一看原来很多基础的东西我从来都不清楚,或者见过然后忘记了。自己在此好好的进行整理总结一下,主要是为了自己复习巩固吧,也希望对某些人有一点作用,当然我的整理中可能存在很多问题,欢迎大牛们来指正。
C#基础知识系列一(goto、i++、三元运算符、ref和out、String和string、重载运算符)的更多相关文章
- 基础知识系列☞C#中→属性和字段的区别
"好吧...准备写个'基础知识系列',算是记录下吧,时时看看,更加加深记忆···" 其实本来准备叫"面试系列"... 字段.属性.你先知道的哪个概念? ***我 ...
- 基础知识系列☞Abstract和Virtual→及相关知识
转载地址→http://www.cnblogs.com/blsong/archive/2010/08/12/1798064.html 在C#的学习中,容易混淆virtual方法和abstract方法的 ...
- 学习javascript基础知识系列第二节 - this用法
通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...
- 学习javascript基础知识系列第三节 - ()()用法
总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...
- C# 基础知识系列- 3 集合数组
简单的介绍一下集合,通俗来讲就是用来保管多个数据的方案.比如说我们是一个公司的仓库管理,公司有一堆货物需要管理,有同类的,有不同类的,总而言之就是很多.很乱.我们对照集合的概念对仓库进行管理的话,那么 ...
- C# 基础知识系列- 9 字符串的更多用法(一)
0. 前言 在前面的文章里简单介绍了一下字符串的相关内容,并没有涉及到更多的相关内容,这一篇将尝试讲解一下在实际开发工作中会遇到的字符串的很多操作. 1. 创建一个字符串 这部分介绍一下如何创建一个字 ...
- C# 基础知识系列- 10 反射和泛型(二)
0. 前言 这篇文章延续<C# 基础知识系列- 5 反射和泛型>,继续介绍C#在反射所开发的功能和做的努力.上一篇文章大概介绍了一下泛型和反射的一些基本内容,主要是通过获取对象的类型,然后 ...
- C# 基础知识系列- 12 任务和多线程
0. 前言 照例一份前言,在介绍任务和多线程之前,先介绍一下异步和同步的概念.我们之间介绍的知识点都是在同步执行,所谓的同步就是一行代码一行代码的执行,就像是我们日常乘坐地铁通过安检通道一样,想象我们 ...
- C# 基础知识系列-13 常见类库(三)
0. 前言 在<C# 基础知识系列- 13 常见类库(二)>中,我们介绍了一下DateTime和TimeSpan这两个结构体的内容,也就是C#中日期时间的简单操作.本篇将介绍Guid和Nu ...
- C# 基础知识系列- 14 IO篇 文件的操作 (3)
本篇继续前两篇内容,跟大家介绍一下Path类以及FileSystemInfo这个类的主要方法和属性. 上文提到,在<C# 基础知识系列-IO篇>之文件相关的内容完结之后,会带领大家开发一个 ...
随机推荐
- linux进程间通信-概述
一 进程间通信有如下的目的: 1.数据传输,一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M之间:2.共享数据,多个进程想要操作共享数据,一个进程对数据的修改,其他进程应该立刻看到 ...
- windows上用netstat查看端口/进程占用
windows上用netstat命令查看某个端口是否占用,被哪个进程所占用 1.查看端口的占用情况,获取进程的PID 命令: netstat -ano | findstr "<端口号& ...
- ubuntu 添加启动器
终于搞定了安卓开发环境,不知道折腾了多少次,多少个IDE,解决了一个问题,又冒出一个问题.烦死了,最后关头,都快放弃了,重启电脑,打开 android stuio 编译运行居然陈宫了,没有报错,why ...
- SOS: gnuplot fdtd的一个问题求助 perl vs python
我用perl和python写了相同功能的一段程序,计算一维fdtd,用gnuplot动态显示,可是python的数据没有显示出来,看横纵坐标的变化数据是正确收到了的,如最后的图片,求大神指点,谢谢. ...
- 数据持久化之sqlite基本用法
一.ACID 即原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持久性(Durability). 原子性:整个事务中的所有操作,要么全部完成,要么全部不完 ...
- 微博API使用
新浪微博的API开放平台: http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI IOS和Android都有SDK可以下载,ios的地址: https:// ...
- $.ajax()方法详解及实例
1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他http请求方法,例如 ...
- Flash Builder快捷键
代码助手:Ctrl+Space(简体中文操作系统是Alt+/)快速修正:Ctrl+1单词补全:Alt+/打开外部Java文档:Shift+F2 显示搜索对话框:Ctrl+H快速Outline:Ctrl ...
- Eclipse去除JavaScript验证错误
这篇文章主要是对Eclipse去除js(JavaScript)验证错误进行了介绍.在Eclipse中,js文件常常会报错.可以通过如下几个步骤解决 第一步: 去除eclipse的JS验证: 将wind ...
- ios app架构设计系统文章
三. iOS应用架构谈(三):网络层设计方案(上) http://www.infoq.com/cn/articles/ios-app-arch-3-1?utm_source=infoq&utm ...