C# 核心基础(1) 持续更新
using System; namespace ConsoleApplicationCShape
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello Wrox.");
Console.ReadLine();
return;
}
}
}
变量初始化
int i = ;
bool mBool = false;
int x = , y = ;
类型推断关键字 var
var name = "Aaron";
var age = ;
var isRabbit = false; Type nameType = name.GetType();
Type ageType = age.GetType();
Type isRabbitType = isRabbit.GetType(); Console.WriteLine("name is type " + nameType.ToString());
Console.WriteLine("age is type " + ageType.ToString());
Console.WriteLine("isRabbit is type " + isRabbitType.ToString());
Console.ReadLine();
输出
name is type System.String
age is type System.Int32
isRabbit is type System.Boolean
- 变量必须初始化。否则,编译器就没有推断变量类型依据
- 初始化器不能为空。
- 初始化必须放在表达式中。
- 不能把初始化器设置为一个对象,除非在初始化器中创建一个新对象。
一旦声明了变量,推断出了类型,不能改变变量类型。
变量作用域
- 只要类在某个作用域内,其字段也在该作用域内。
- 局部变量存在于声明该变量的语句块或方法结束的右花括号之前的作用域内。
- 在for、while或类似语句中声明的局部变量存在于该循环体内。
局部作用域冲突
只要变量的作用域是程序的不同部分,就不会有问题,也不会产生多义性。注意,同名局部变量不能再同一作用域内声明两次。
int j = ;
for (int i = ; i < ; i++)
{
int j = ;
Console.WriteLine(i + j);
}
for (int i = ; i < ; i++)
{
int j = ;
Console.WriteLine(i + j);
} for (int i = ; i < ; i++)
{
int j = ;
Console.WriteLine(i + " " + j);
}
字段和局部变量的作用域冲突
字段 (静态变量)
static int j =
局部变量
int j =
static int j = ;
static void Main(string[] args)
{
int j = ;
Console.WriteLine(j);
Console.WriteLine(Program.j);
Console.ReadLine();
}
常量
- 常量必须声明时初始化。执行值后,就不能再改写了。
- 常量的值必须能在编译时用于计算。因此,不能从一个变量中提取的值用来初始化常量。(如果一定要这样做,可以用 readonly 只读)
- 常量总是静态的,所以不能常量声明中包含修饰符 static
const int j = ;
预定义数据类型
值类型和引用类型
C#数据类型分为 值类型 和 引用类型
值类型直接存储其值,引用类型存储对值得引用。
值类型存储在堆栈中,引用类型存储在托管堆上。
值类型
int x = ;
int j = ;
引用类型
Vector x, y;
x = new Vector();
x.X = ;
Console.WriteLine(x);
y = x;
y.X = ;
Console.WriteLine(y);
Console.WriteLine(x);
输出
,
,
,
注意 我这里 Vector 只有在 System.Windows.WindowsBase 命名空间中,大家要测试引用类型时,需创建WPF程序。
要创建对象,须使用new 关键字。因为 x 和 y 引用同一对象,所以修改 x,也会影响 y 。当然值类型是不会有影响的。
CTS类型
C# 有15个预定定义类型,其中13个是值类型,2个引用类型(string 和 object)
8个整数类型 sbyte、short、int、long、byte、ushort、uint、ulong
2个浮点类型 float、double
1个高精度浮点数 128位 decimal
1个布尔类型 bool
1个单字符类型 char
2个预定义引用类型 object、string
声明 decimal
decimal d = 12.30M;
声明 char
char c = 'x';
声明 string
string str = "Hello world";
转义字符
string str1 = "C:\\Program Files (x86)\\ADSafe";
string str2 = @"C:\Program Files (x86)\ADSafe";
甚至包含换行符
string str2 = @"C:\Program Files (x86)
\ADSafe";
Console.WriteLine(str2);
流控制
if
int intInput = Int32.Parse(Console.ReadLine()); if (intInput == )
{
Console.WriteLine("Input 10");
}else if (intInput == )
{
Console.WriteLine("Input 20");
}
else
{
Console.WriteLine("Input Error");
}
Console.ReadLine();
如果条件分支只有一条语句,就无须使用花括号:
if (intInput == )
Console.WriteLine("Input 10");
switch
while (true)
{
int intInput = Int32.Parse(Console.ReadLine());
switch (intInput)
{
case :
case :
Console.WriteLine("Input 10");
break;
case :
Console.WriteLine("Input 20");
goto case ;
break;
case :
Console.WriteLine("Input 30");
break;
default:
Console.WriteLine("Input Error");
break;
}
}
break 结束当前循环
continue 退出当前迭代,进行下一轮迭代
循环
for
for (int i = ; i < ; i++)
{
Console.WriteLine(i);
}
i++ ==> i = i + 1 ==> i += 1
while
int i = ;
while (i < )
{
i++;
Console.WriteLine(i);
}
do while
int i = ;
do
{
i++;
Console.WriteLine(i);
} while (i < );
foreach
int[] arr = new int[] {,,,,,};
foreach (int value in arr)
{
Console.WriteLine(value);
}
跳转语句 goto、break、continue、return
枚举
public enum TimeOfDay
{
Morning = ,
Afternoon = ,
Evening =
}
使用
TimeOfDay time = TimeOfDay.Afternoon;
Console.WriteLine(time.ToString());
Console.WriteLine((int)time);
名称空间
namespace ConsoleApplicationCShape
{
namespace CustomerPhoneBookApp
{
class NamespaceExample
{ }
} class Program
{
static void Main(string[] args)
{ }
}
}
using语句
using System;
using System.Collections.Specialized;
名称空间的别名
using System;
using System.Collections.Specialized;
using CusNameSpace = MyNamespace; namespace MyNamespace
{
class Test { }
} namespace ConsoleApplicationCShape
{
class Test { }
class Program
{
static void Main(string[] args)
{
//不使用限定名向上搜索匹配的命名空间,查找不到会输出错误
Console.WriteLine(typeof(Test));
Console.WriteLine(typeof(CusNameSpace::Test));
Console.ReadLine();
}
}
}
全局命名空间
using System;
using System.Collections.Specialized; class Test { } namespace ConsoleApplicationCShape
{
class Test { }
class Program
{
static void Main(string[] args)
{
Console.WriteLine(typeof(Test));
Console.WriteLine(typeof(global::Test));
Console.ReadLine();
}
}
}
每个类都有个Type对象 this.GetType().Namespace;
Main方法
C#程序从Main开始执行的,这个方法必须是类或结构的静态方法,返回类型必须是 int 或 void。修饰符指定什么访问级别并不重要。
多个main方法
在编译C#时,在多个main方法是,需要指定Main方法所属类的全名,告诉程序的入口点。
csc DoubleMain.cs /main:Wrox.MathExample
给main传递参数
static void Main(string[] args)
{
for (int i = ; i < args.Length; i++)
{
Console.WriteLine(args[i]);
}
Console.ReadLine();
}
输出
>ConsoleApplicationCShape.exe z z
static void Main(string[] args)
有关编译 C# 文件的更多内容
csc /target 选项
- /t:exe 控制台应用程序 默认
- /t:library 带有清单的类库
- /t:moudle 没有清单的组件
- /t:winexe Windows应用程序
/out 选项
指定编译器生成的输出文件名
/reference 或 /r 引用程序集
csc /r:system.windows.forms.dll
示例
csc /t:library MathLibrary.cs
编译文件时
csc MathClient.cs /r:MathLibrary.dll
控制台 I/O
Console.WriteLine();
- Console.ReadLine();
格式化字符串
Console.WriteLine("{0}、{1}",100,200);
Console.WriteLine("{0,30}\n{1,30}", 100, 200);
{w,n} n 是参数索引,w是宽度值。
格式化字符串类型
- C 本地货币格式
- D 十进制,如果需要精度,前面加上0
- E 科学计数法格式,默认小数位数6 格式化字符串的大小写(e或E)指定指数符号的大小写
- F 浮点数类型,可以设置小数位数,可以为0
- G 普通格式
- N 数字格式,用逗号表示千分符如 32 767.44
- P 百分数格式
- X 十六进制格式
除了 e/E 之外,格式字符串都不需要考虑大小写。
本地货币格式,精度设置为两位小数
double d = 0.234;
Console.WriteLine("{0, 9:C2}", d);
注释
// this is a single-line comment
/*
* This Comment
* spans mutiple lines.
*/
生成 注释XML 文档
/// <summary>
/// 返回两位整数相加的值
/// </summary>
/// <param name="x">X 整数值</param>
/// <param name="y">Y 整数值</param>
/// <returns>返回相加值</returns>
public int Add(int x, int y)
{
return x + y;
}
csc /t:library /doc:MathLibrary.xml MathLibrary.cs
C# 预处理指令
使用预处理指令可以境值编译器编译与额外功能相关的代码。还是可以提供调试信息的代码时,也可以用。
#define 和 #undef
#define 指定编译器名称符号
#undef 删除指定编译器名称符号
#if、#elif、#else、#endif
#define ENTERPRISE using System;
using System.Collections.Specialized; namespace ConsoleApplicationCShape
{ class Program
{
static void Main(string[] args)
{
#if ENTERPRISE && W2K == false
Console.WriteLine("Hello");
#endif
Console.ReadLine();
}
} }
#warning 和 #error
如果编译器遇到 #warning 会给用户显示 #warning指令后面的文本。
如果遇到 #error,显示后面的文本,作为编译器错误消息,退出编译,不会生成IL代码(.net 中间代码)。
#if ENTERPRISE
#warning This is a warning
#endif
#error This is a error
然后可以在VS2015的错误列表中看到。
#region 和 #endregion
#region 和 #endregion 把一段代码给定给定名称一个块。
#region 这是一个输入文件块
Console.ReadLine();
#endregion
然后可以折叠这块代码
#line
改变编译器在警告或错误信息中显示的文件名和行号信息。
#line 2 "Core.cs"
#warning 警告
#error This is Error
#pragma
抑制或还原指定的编译警告。
如下面 禁止"字段未使用警告"
#pragma warning disable 15
static void Main(string[] args)
{
int neverUsedField;
Console.ReadLine();
}
#pragma warning restore 15
C# 核心基础(1) 持续更新的更多相关文章
- Pig语言基础-【持续更新中】
***本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解.目前正在持续更新中.*** Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的, ...
- nodejs基础【持续更新中】
简介 Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-dr ...
- python开发--基础知识-(持续更新)
python基础 --基础: 1, 第一句python - 用cmd 调用--python (路径)+(文件名)) 扩展名是任意的 - 导入模块是,如果不是.py文件,可能导入不成功 - python ...
- MVC基础知识-持续更新....
1.如何在自动生成的视图中显示需要的字段名称: 在相应的定义字段中添加Display,例如: [Display(Name = "用户名:")] public string User ...
- Java基础——集合(持续更新中)
集合框架 Java.util.Collection Collection接口中的共性功能 1,添加 booblean add(Object obj); 往该集合中添加元素,一次添加一个 boolea ...
- Java基础——多线程(持续更新中)
如何建立一个执行路径呢? 通过查询API文档 java.lang.Thread类 该类的描述中有创建线程的两种方式 1.继承Thread类 (1).将类声明为 Thread 的子类 (2).该子类应重 ...
- Linux 基础命令 持续更新中...
1.ls 显示当前文件/文件夹 显示文件大小: ls -lh 显示隐藏文件: ls -a 显示文件详细信息: ls -l (ll)2.pwd 显示当前所在路径 cat 显示当前文件下所有内容3.cd ...
- GNSS基础(持续更新)
1.整周模糊度成功率 可参考文献:GNSS整周模糊度概率特性 2.正太分布 见百度百科 https://baike.baidu.com/item/%E6%AD%A3%E6%80%81%E5%88%86 ...
- Linux服务器安全检测维护基础汇总/持续更新
登陆系统查询可以用户 w命令可以显示在线用户,passwd -l xxx可以锁定xxx用户无法登陆,如果此时可以用户在线,使用kill命令踢下线 查看可疑进程 ps -ef命令锁定pid,或者pido ...
随机推荐
- codevs 1163:访问艺术馆
题目描述 Description 皮尔是一个出了名的盗画者,他经过数月的精心准备,打算到艺术馆盗画.艺术馆的结构,每条走廊要么分叉为二条走廊,要么通向一个展览室.皮尔知道每个展室里藏画的数量,并且他精 ...
- SQL Server数据库语法(一)
--创建数据库 DB_CYITcreate database DB_CYITON(name='DB_CYIT',--主文件逻辑名称filename='G:\data\DB_CYIT.mdf', --文 ...
- web前端页面解决中文传参乱码问题
问题背景:在项目中往往会涉及到前端跳转页面时要传一些参数给下一个页面,如果参数是英文或者数字的时候就很好解决,然而有时候传参会涉及到中文汉字,这个时候再单纯的拼接往往就会导致中文乱码,下面我们就该讨论 ...
- mysql 查询最佳实践
(1)负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不是好习惯 (2)前导模糊查询不 ...
- 剑指offer17:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
1 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 2 思路和方法 (1)先在A中找和B的根节点相同的结点 (2)找到之后遍历对应位置的其他结点, ...
- 微信小程序 路由跳转 异步请求 存储数据,微信登录接口
1小程序路由跳转 wx.switchTab(Object object) 这里的tabBar是底下的导航栏指定的页面 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 tabBar l ...
- 设计模式风格<二>;消息总线
以前开发的动车模拟驾驶系统,有好几个软件(不在一台机器上),他们互相之间通信,因此每个软件要配置每个模块的IP和端口,就是每个模块都要知道别的模块的端口和IP. 这样有个重复的地方,B模块和C模块都要 ...
- 使用XPath爬取网页数据
我们以我的博客为例,来爬取我所有写过的博客的标题. 首先,打开我的博客页面,右键“检查”开始进行网页分析.我们选中博客标题,再次右键“检查”即可找到标题相应的位置,我们继续点击右键,选择Copy,再点 ...
- ThreeJS中创建文字的几种方法
1. DOM + CSS 传统html5的文字实现,用于添加描述性叠加文字的方法.一般使用绝对定位,并且保证z-index够大,用于显示在3D场景之上. 优点: 与CSS3D效果一致 缺点: 3d效果 ...
- docker 第五篇 存储
镜像概述复习 Docker镜像由多个只读层叠加而成,启动容器时,Docker会加载只读镜像层并在镜像栈顶部添加一个读写层 如果运行中的容器修改了现有的一个已经存在的文件,那改文件将会从读写层下面的只读 ...