21天学通C#阅读笔记(一)

本文是作者21天学习C#语言的心得笔记,内容涵盖C#的基本概念、编程周期、代码编写、变量、运算符、控制语句等方面。通过实例解析C#中的注释、数据类型、变量声明、赋值运算、逻辑判断、循环结构等基础知识,强调动手实践的重要性。
==================================
第一天:
C#是微软公司开发的一种编程语言。2000年6月发布。
C#是一种面向对象语言(oop:Object Oriented Programming)
---------------

C#与JAVA类似,是从C,C++改进来的。
特点:简单,现代,是面向对象的程序,强大、灵活,包含单词为数不多,是模块化的,C#将流行。(枯燥无味的特点,个人认为有待于进一步验证。)
模块化的,建立了类的概念。类可以被重复使用,通过给类或方法传递信息,得到所需结果。
---------------

编程前的准备工作:首先要明确问题,然后制定解决问题的方案。方案实现后,对结果进行测试,以了解问题是否得到解决。(相信很多菜鸟刚接触编程的时候很迷茫,其实很大程度上是没有明确自己要干什么,要解决什么问题。有了问题才能有相应的解决方法。而编写一个程序,就是把解决方法通过编程语言来实现。)

SO, 编写一个程序的步骤:
1.明确编写的程序将要实现何样的功能。
2.确定编写程序时采用何样的方法。
3.创建程序。
4.运行程序,检查结果。
3、4步骤为一个程序的开发周期。具体过程与JAVA类似,先使用编辑器创建包含源代码的文件。然后对源代码进行编译,以创建被成为可执行文件或库文件的中间文件。最后是运行程序,检测能否按照预期的规划情况运行。
---------------

第一行C#源代码:System.Console.WriteLine("Hello,Justin!");  ----输出“Hello,Justin”

编辑器,即开发工具。推荐使用:VS2005
保存源代码文件可以任意设置扩展名,习惯通用“.cs”
-------------------
第一个C#程序

class Hello
{
static void Main()
{
System.Console.WriteLine("Hello,Justin!");
}
}

可以使用任意一种文本工具写,另存为hello.cs。经测试,要编译的文件名是不区分大小写的。
可能使用不同的编译器,操作步骤会有区别。在这里我是使用的vs2005,在命令行下进行编译。
csc hello.cs
会生成一个hello.exe的可执行文件,运行结果是在屏幕上输出Hello,Justin!

结合学习其他语言的过程,重点看了下报错过程。能将错误具体报出,实在是一件很爽的事情。用ASP的时候,要不停的response.write end() 痛苦,实在是痛苦。同样C#也无法判断逻辑上的错误。

OK,第一天顺利结束,并没有碰到无法理解的问题。友情提示:学习一门编程一定要动手,动手,动手。
===================================================================


第二天
通过第一天的学习,建立C#编程语言的概念,开发周期:写代码--编译--运行,开始第二天。
-----------------------------------------------
大纲:c#应用程序的组成部分,C#的语句和表达式,面向对象编程技术的特征,封装/继承/多态/重用,在程序中显示基本信息.

从一个C#程序开始分析

//app.cs - A sample c# application
//Don`t worry about understanding  everthing in this listing.You`ll learn all about it later!
//--------------------------------------

using System;
class sample
{
    public static void Main()
    {
    //Declare variables
        int radius = 4;
        const double PI = 3.1459;
        double area;

        //Do calculation
        area=PI*radius * radius*radius;
        Console.WriteLine("Radius={0},PI={1}",radius,PI);
        Console.WriteLine("The area is {0}",area);
    }
}

编译后,运行结果:
Radius=4,PI=3.14159
The area is 201.3376
--------------------------------------------
首先是注释,分单行注释,多行注释,文档注释三种.

//单行注释内容

/*
多行注释内容
*/

///文档注释内容

文档注释可以用"csc /doc:***.xml ***.cs"来提取成XML文件.(个人认为在编写应用程序的时候用处比较大,平时使用单行注释就足够了)

接下来才是C#语言的组成部分:
a.空白.空白总是被编译器忽略,包括空格,换行符等.(好的编程习惯:int radius = 4;)但是在双引中间的空白不会被忽略.
b.c#关键字.关键字都含有特殊含义,需要被保留.不能将其挪作他用.
c.字面值.这个概念比较抽象,后面有详细介绍.
d.标识符.同样比较抽象的概念.暂切不理.

---------------------------------------------------
分析上面的程序:
1~4行:注释
5,7,13,17,21,23行:空白
6行:using语句(第六天讲详细介绍)
8行:类声明(第六天详细介绍)
9,11,26,27行:标点字符
10行:Main()
c#将从Main()函数开始执行代码,通过调用函数名来运行.(第七天详细介绍)
14,15,16行:声明
20行:赋值语句
24,25行:调用函数(初学者最难理解的地方)

对比以前了解过的JAVA程序,二者是多么的相似.程序结构几乎是一模一样.
----------------------------------------------------

面向对象的概念

(听很多人说面向对象程序,但是一直没有明确这个概念.这里要理解的概念性东西含多.当然,个人觉得还是以应用为主,概念不理解,可以以后再搞懂.但是弄清楚概念,对于理解一些书面的东西还是有好处的)

一种语言,它使用对象,具有封装,多态,继承,重用的特点.

封装:封装指的就是创建"包".用户不用去关心包内的程序是如何执行的,只需要了解如何与包交互.得到所需结果即可.
多态:多态是呈现多种形态的功能.(看完介绍还是不太理解,11天有详细介绍)
继承:(不理解,还是不理解.懵懵懂懂,一知半解的,跳过)
重用:面向对象最重要的特点.

对象和类的概念跳过,第六天详细介绍.

两个将信息打印到屏幕上的例程:
System.Console.Write()
System.Console.WriteLine()
区别是,WriteLine()在新的一行中输出信息,而Write()在本行输出.
之前程序中用到System.Console.WriteLine("ceshi{0},{1}",ceshi0,ceshi1).类似数组的概念.

-------------------------------------
第二天有很多概念性的问题,需要参照后面的详细介绍进一步理解
从第三天开始,不再是枯燥的概念性东东,将开始介绍数据类型,运算符,语句等编写程序所需要的基本组成.

=============================================================================================================
第三天 使用变量存储信息

变量是计算机内存中被命名的数据存储单元.
变量可以存储任意类型的数据.

变量的命名规则:可以包含数字,字母和下划线;第一个字符只能是字母或下划线(不推荐使用下划线,会降低程序的可读性.);区分大小写;不能将C#的关键字用作变量名.
编程习惯:变量名使用小写字母,常量使用大写字母.多个单词组成的变量,单词间用下划线隔开.如hello_justin
骆驼表示法(Camel notation):将多个单词组成的变量名,每个单词的第一个字母大写.如HelloJustin

变量使用前,需要声明,否则编译器将生成错误信息.
声明格式:int count,number,start;
声明多个变量,在一行或多行中生成,对性能无影响,单多行声明可增加程序的可读性;
下面通过一个程序来了解给变量赋值:
//var_values.cs - A listing to assign and print the value of a variable
//---------------------------------------------------------------------


using System;

class var_values
{
    public static void Main()
    {
    //declare my_variable
        int my_variable;
        //assign a value to my_variable
        my_variable = 5;
        Console.WriteLine("/nmy_variable contains the value {0}", my_variable);

        //assign a new value to my_vairable
        my_variable = 1010;
        Console.WriteLine("/nmy_variable contains the value {0}",my_variable);
    }
}

初始化变量:int my_variable=1;
声明int型变量my_variable的同时给他赋值为1.这种声明同时初始化的操作,是一个好习惯.

注:未初始化的变量,在c和c++中是可以被编译的,但c#是不允许使用未初始化变量.
--------------------------------------------------------------------------
变量类型中的数值型:4类(在这里涉及到各类型数值占用字节数,忘记是学什么的时候接触到了,N久以前的事情.不理解的,需要专门学习下.占用字节数的多少,直接决定取值范围.)
a.整数
细分:整数(int和uint,4字节),短整数(short和ushort,2字节),长整数(long和ulong,8字节),Byte(byte和sbyte,1字节),字符(char,2字节).
int是带符号的整数,可存储-2147483648()到2147483647之间的整数;uint是不带符号的整数,可存储0~4294967295之间的整数
使用short和unshort,可以在存储整数的同时节省内存.short取值范围,-32768~32767;ushort取值范围,0~65535.
使用long和ulong,可存储非常大的整数.long取值范围,-9223372036854775808~9223372036854775807;ulong取值范围,0~18446744073709551615.
使用byte和sbyte,可存储仅占1字节整数.byte取值范围,-128~127;sbyte取值范围0~255.
使用char可以存储字符.这里引入了Unicode的标准.Unicode将字符和符号都使用一个整数表示.所以可以将char视为整型.
    给char赋值需要使用:char variable='hello'
b.浮点数
细分:float,4字节和double,8字节.
个人认为除特殊用途外,一般很少用到小数.
c.decimal
存储高精度小数,8字节,个人认为使用的几率更小.
d.布尔型
bool.取值只有true(真)或false(假),通常被设置为0或1.

--------------------------------------------------------------
常量:
声明常量后,可以防止在使用过程中值被更改
声明规则:const PI=3.14159;
习惯将常量全部大写.
--------------------------------------------------------------
引用类型:(又一个比较难理解的概念)
按引用存储和按值存储.
基本数据类型,int/char等都是按值存储.
类,字符串,接口,数组,代表(delegate)都是使用按引用存储.

不是很理解按引用存储,个人理解应该是类似数组存储一组数字的概念.后面会有详细介绍.
程序清单3.4中介绍了各个数据类型所需内存空间.
第三天顺利结束,接下来是运算符和语句了.
========================================================================================
第四天  使用运算符

运算符分类:基本的赋值运算符;数学/算术运算符;关系运算符;条件运算符;其他运算符(类型,大小等).

运算符结构分三类:单目,双目和三目.
分别使用单个变量(-1),两个变量(1+1)和三个变量(真正的三目c#运算符只有条件运算符).

介绍运算符之前提到标点符号的概念:
a.分号:主要用于结束一条c#语句,也可以用于控制流程的c#语句.
b.逗号:用于将多个命令放在同一行中,最多用于声明同一类型的多个变量.
如:int var1,var2,var3;
c.圆括号:用于函数中,使用圆括号来强制改变执行顺序(后面将提到).
d.花括号:用于代码片段分组.如用花括号来括住类.(花括号自身和括号之间的代码被成为代码块.)

-----------------------------------------------------------------------------
赋值运算符:  =
用于赋值,如:x=142;将运算符右边的值赋值给左边的变量.
x=y=1; 这样的写法是成立的.先将1赋值给y,再将y的值1赋值给x.
1+x=y;是不成立的.也不能将常量或字面值放在赋值运算符的左边.

数学运算符: 加+,减-,乘*,除/,求余%,递增++,递减--.
与数学运算相同.需要注意的是复合运算符+=,-=,*=,/=,%=
对应规则为,x=x+y对应x+=y
x=x-y对应x-=y
x=x*y对应x*=y
x=x/y对应x/=y
x=x%y对应x%=y
使用复合运算符可以使程序更简洁.但程序不容易被理解,可以采用加注释的方法弥补.

递增,递减为单目运算符.运算结果为将变量+1,-1
对应规则为,++x对应x=x+1
--x对应x=x-1

注意先递增和后递增的概念.如x=++y,先将y递增,然后给x赋值.x=y++,则是先给x赋值,然后将y递增.递减同理.
先递增,将递增运算优先执行.后递增,将递增运算符最后执行.
不理解的,可以参考程序清单4.3来理解.

关系运算符:大于>,小于<,等于==,不等于!=,大于等于>=,小于等于<=
最终得到的结果只有真和假两个结果

if语句:-----------大名鼎鼎的if语句啊,使用的太多了.
分析程序来理解if语句.
//iftest.cs - The if statement
//----------------------------

class iftest
{
    static void Main()
    {
        int val1 = 1;
        int val2 = 2;

        System.Console.Write("Getting ready to do the if....");
        if (val1 == val2)
        {
            System.Console.Write("If condition was true");
        }
        System.Console.WriteLine("Done with the if statement");
    }
}

与其他语言中if语句用法没什么区别,需要注意的是,C#中使用{}来划分代码段.

条件逻辑运算符号:条件"和"&&,条件"或"||.
&&执行逻辑"与"
||执行逻辑"或"
这里需要参考与非或的逻辑运算.熟悉与非或的运算后,只需要掌握在C#中的逻辑运算符.

逻辑按位运算符:不在本书存储范围内,可以选择性理解.

类运算符:在后面介绍类和接口时涉及.运算符typeof,is,as

sizeof运算符:用于确定值的长度.因sizeof运算直接操纵内存,尽量避免使用.

条件运算符:
condition?IfTrueStatement:IfFalseStatement;
condition是条件,结果为true执行iftrueStatement,结果为flase执行iffalsestatement.
运用条件运算符,可以使代码更简洁,但是代码的可读性会降低.一般用来替代if语句.

--------------------------------------------------------------------------------
运算符的优先级:
表4.3详细介绍了运算符的优先级.与其他编程语言相比,运算符优先级并没有什么区别.
可以通过括号来改变运算的优先级,括号内的运算,总是优先执行.

---------------------------------------------------------------------------------
转换数据类型:
将一种类型变量的值赋给另一种类型的变量,需要先进行类型转换.对不同类型的数值进行运算,也需要先转换类型.
分显式和隐式两种.
隐式转换自动进行,显式转换需要强制转换.格式为:ToVariable - (datatype) FromVariable;
表4.4介绍了需要进行显式转换的类型.

隐士转换与运算数提升(operanol promotion)相关.
当两个变量执行基本的算术预算时,执行前会被转换成相同的数据类型.
提升次序:byte,int,uint,long,ulong,float,double,decimal.

按位运算符,顾名思义,按每个变量的存储单元进行运算.实质上是翻译成ASCII码后再运算.很少用到

第四天O了.数据类型与运算,一门编程语言中基础的基础.

================================================================================================
第五天 控制语句


按照改变流程的方法可分为选择语句和循环语句.

----------------------------------------------------
选择语句,可以根据条件的结果执行特定的代码段.if和switch都是选择语句.

if...else语句的格式
if 条件
{
结果1
}
else
{
结果2
}

当条件为真时,执行结果1,为假时执行结果2.

switch...case...break语句的格式
switch (条件值)
{
case 值1:
结果1;
break;
case 值2:
结果2;
break;
default:
上述条件均不满足时输出的结果;
break;
}
每条case语句都以break为结束.如果条件值与值1,2都不相等,则执行default语句.

当多个条件使用同一种解决方案时.可以使用下面的方案.
switch (条件值)
{
case 值1:
case 值2:
结果A;
break;
case 值3:
case 值4:
结果B;
break
default:
结果C;
break;
}

当条件值等于值1或值2时,输出结果A,条件值等于值3或值4时,输出结果值B.
省略break;时,case语句之间不能存在代码.

使用goto命令跳到某个case语句或default语句,格式:
switch (条件值)
{
case 值1:
goto case 值3;
break;
case 值2:
goto case 值3;
break;
case 值3:
结果A;
break;
default:
结果B;
break;
}

sbyte,byte,short,ushot,int,uint,long,ulong,char或文本字符串都可用在switch语句中.
如表达式的数据类型不是上述类型,则需要该数据类型有唯一的一种隐式转换方式可以转换为上述类型.
如果没有隐式转换方式,或转换方式不只一种,就会发生编译错误.

需要注意的是,if和switch的条件句后面,没有;来结束.

-----------------------------------------------------------------------
夜深了,洗洗睡了,明天将笔记发到blog上.
可能是今天涉及到的东西与java有很大的相似性,而且没有概念上的疑问,动手写的很少.
这是个不好的习惯,一定要戒除.动手是学习任何一门编程语言的正道.
明天继续循环语句.
-----------------------------------------------------------------------
循环语句:while,do,for,foreach

while语句,当条件为真时,不断重复执行代码块.
while (condition)
statement(s)

通过一个程序理解while语句
//average.cs - Using the while statement.
//Print the average of 10 random numbers that are from 1 to 10.
//-------------------------------------------------------------

class average
{
    public static void Main()
    {
        int ttl = 0; //variable to store the running total
        int nbr = 0; //variable for individual numbers
        int ctr = 0; //counter

        System.Random rnd = new System.Random(); //random number

        while (ctr < 10)
        {
        //Get random number
            nbr = (int)rnd.Next(1, 11);
            System.Console.WriteLine("Number {0} is {1}",(ctr+1),nbr);
            ttl += nbr; //add nbr to total
            ctr++; //increment counter
        }
        System.Console.WriteLine("/nThe total of the {0} numbers is {1}", ctr, ttl);
        System.Console.WriteLine("/nTHe average of the numbers is {0}",ttl/ctr);
    }
}

上述程序,生成了10个1~10之间的随机数,并且求他们的平均值.
使用到了生成随机数,递增来辅助while完成运算.

通过break;和continue;来加强while语句.

还是通过一个程序来理解.
//even.cs - Using the while with the break and continue commands.
//---------------------------------------------------------------


class even
{
public static void Main()
{
    int ctr = 0;
    while (true)
    {
        ctr++;

        if (ctr > 10)
        {
            break;
        }
        else if ((ctr % 2) == 1)
        {
            continue;
        }
        else
        {
            System.Console.WriteLine("...{0}...", ctr);
        }
    }
    System.Console.WriteLine("Done!");
}
}

while的条件设置为true,实际上是人为创造了一个死循环.
当满足break;条件时,跳出while语句.
当满足continue条件时,继续执行while语句.


do语句,如果在首次检查的时候,while语句的条件便不满足,则while语句中的代码块一次也不不会执行.
但有时候,希望语句至少执行一次.在这种情况下,do语句就能很好解决.
格式:
do
  statement(s)
while (condition);

do语句讲先执行代码块,然后对while语句的条件进行检查.
老规矩,上程序

//do_it.cs - Using the do statement.
//Get random number (from 1to 0) until a 5 is reched.
//---------------------------------------------------

class do_it
{
    public static void Main()
    {
        int ttl = 0;
        int nbr = 0;
        int ctr = 0;

        System.Random rnd = new System.Random();

        do
        {
            nbr = (int)rnd.Next(1, 11);
            ctr++;
            ttl += nbr;
            System.Console.WriteLine("Number {0} is {1}", ctr, nbr);
        } while (nbr != 5);

        System.Console.WriteLine("/n{0} number were read", ctr);
        System.Console.WriteLine("The total of the number is {0}", ttl);
        System.Console.WriteLine("The average of the numbers is {0}",ttl/ctr);
    }
}

程序中,希望至少执行操作(获取一个随机数)一次.然后一直执行该操作到条件(获取随机数为5).这情况适合使用do语句.

for语句
for (initializer;condition;incrementor)
statement(s)

for语句被执行时,先执行initializer,且在整个for语句种只执行这一次;
然后对condition进行检查,为真则执行statement(s).为假则停止for语句;
执行完一次statement(s)后,将返回到for语句开始位置,执行incrementer;
循环执行statement(s),直到condition为假.

下面用for语句构造一个与程序清单5.4完全相同功能的程序.

//average1.cs - Using the for statement.
//print the average of 10 random numbers that are from 1 to 10.
//-------------------------------------------------------------


class average1
{
    public static void Main()
    {
        int end = 0; //定义变量end,存储随机数的和
        int cou = 0; //定义变量cou,存储已获取随机数的个数
        int num = 0; //定义变量num,存储获取到的随机数

        System.Random ran = new System.Random(); //定义变量ran,存储获取随机数的函数

        for(cou=1;cou<=10;cou++)
        {
            num = (int)ran.Next(1, 11);
            System.Console.WriteLine("第{0}个随机数是{1}", (cou), num);
            end += num;
        }
        System.Console.WriteLine("{0}个随机数的和是{1}",(cou-1),end);
        System.Console.WriteLine("{0}个随机数的平均值是{1}", (cou-1), end / 10);
    }
}

--------------------------------------------------------------------------------------------
foeach语句以类似for语句的方式执行循环,但可以遍历如数组等集合.将在第八天中详细介绍.

break和continue命令都可以在流程语句中使用
在while和do...while语句中,continue将返回到条件语句处,break将跳出循环语句.
在for语句中,continue将转到incremetor处,break将跳出循环语句.
总结,break将跳出循环,contiune将开始下一次循环.

--------------------------------------------------------------------------------------------
使用goto
goto命令可以无条件的改变程序流程,但是容易导致代码难以理解.
使用方法有三种:goto case和goto default在switch语句中使用,还有一种goto label;
goto label;可以转到一条标签语句.
标签语句是一个指示位置的命令,格式为: label_name:   以冒号结束
通过下面程序来理解使用带标签的goto语句.
//score.cs Using the goto and label statements.
//Disclaimer: This program shows the use of goto and label
//            This is not a good use; however, it illustrates the functionality of these keywords.

class score
{
    public static void Main()
    {
        int score = 0;
        int ctr = 0;
        System.Random rnd = new System.Random();

    Start:
        ctr++;

        if (ctr > 10)
            goto EndThis;
        else
            score = (int)rnd.Next(60, 101);
        System.Console.WriteLine("{0} - You received a score of {1}", ctr, score);

        goto Start;

    EndThis:

        System.Console.WriteLine("Done with scores");
    }
    }

goto这种用法,很容易导致代码可读性降低.应尽量避免使用.


还有其他throw,try,catch,finally等流程控制语句.后面课程将介绍

第五天结束,四和五这两天介绍了重中之重的数据类型和流程控制语句.如果c#是一个人学习的第一门编程语言,建议用大量的练习来熟悉这些课程.

=================================================================================================================

差点让if语句给搞迷糊了,后来想起if...else的原则.当一段代码中出现多个if...else时候,遵循就近原则,else与最近的if配对.
=================================================================================================================

C#语言种面向对象的、安全的、现代的计算机编程语言。其结构, 清晰、效率高、功能强,目标是想拥有C++的执行效率和运算能力,同时也, 具备像Visual Basic样的易用性。秦婧等编著的《21C#》分为六, 篇共21章的内容。其中第篇是C#基础语言篇,主要包括C#概述、变量和, 表达式、流程控制、C#面向对象基础知识、面向对象的关键技术、.NET内, 置对象、调试和异常处理;第二篇的主要内容是C#的Windows编程,讲解, Windows编程基础、使用Windows Forms和对话框、Windows应用程序的部署, ;第三篇主要分析C# Web开发的内容,主要包括Web应用程序开发、Web应, 用程序的调试和异常处理、Web应用程序的部署和配置、Web应用程序的安, 全性和用C#开发Web Service;第四篇是数据操作篇,主要内容包括, ADO.NET基础知识、XML编程和数据绑定技术;第五篇是C#高级编程篇,主, 要包括文件和注册表操作、多线程和同步;最后篇为综合篇,用文章发, 布系统演示如何使用C#进行实例开发。, 《21C#》的特点是简单易懂、内容全面、实例多、详细地介绍, 了C#语言的基础和ADO.NET的相关知识。本书适合没有编程基础的C#语言初, 者作为入门教程,也可作为大、中院校师生和培训班的教材。对于C#语, 言开发的爱好者,本书也有较大的参考价值。, 本书附赠DVD光盘1张,内容包括超大容量手把手教视频、电子教案, (PPT)、源代码、职场面试法宝等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值