目录
一、程序集信息
【1.1】Properties中AssemblyInfo文件
二、.Net程序的两次编译过程
三、.Net中命名空间和类
【3.1】引入命名空间
【3.2】修改默认的命名空间
【3.3】命名空间的总结
四、.Net中数据类型
【4.1】数值型
【4.2】非数值型
五、.Net中变量
【5.1】变量命名规范
【5.2】类、属性、方法命名规范
六、控制台输入输出
【6.1】基本输入输出
【6.2】字符串格式化方法
七、运算符
【7.1】算数运算符
【7.2】关系运算符
【7.3】逻辑运算符
【7.4】位运算符
【7.5】赋值运算符
【7.6】其他运算符
八、数据类型转换
【8.1】自动类型转换
【8.2】强制类型转换
【8.3】字符串与值类型转换
【8.4】万能转换器
九、程序逻辑语句
【9.1】判断语句
【9.2】循环语句
主要是用来保存项目的说明信息和相关的版权信息。
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("FirstApp.Console")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Home")]
[assembly: AssemblyProduct("FirstApp.Console")]
[assembly: AssemblyCopyright("Copyright © Home 2023")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
// 请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("4494d8d4-3fe6-4e42-9b63-f5fc7744f966")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
// 可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
// 通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
程序集信息的修改方法一:同过上面代码对应下面的图进行修改:
程序集信息的修改方法二:
类的概念:在面向对象编程语言中,类是程序的基本单元,用类可以封装要处理的数据(属性、字段)和具体的处理过程(放法)。
一个程序的组成结构:
// 引用的命名空间。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
///
/// 命名空间
///
namespace App.ConsoleApp
{
///
/// 类
///
internal class Program
{
///
/// 项目入口函数
///
/// 启动参数
static void Main(string[] args)
{
#region Test Code
Console.WriteLine("Hollo World!");
Console.ReadKey();
#endregion
}
}
}
// 引入命名空间的语法:
using FirstApp.Console;
// 用完全限定名的语法:<项目名> + <类名>
FirstApp.Console.TestClass testClass = new FirstApp.Console.TestClass();
必须要由:任何一个类都要属于一个命名空间。
用于管理:通过命名空间更好的对 “类” 进行分类管理。
自己规划:一个项目可以根据实际的需要,开发者自己划分若干命名空间。
默认名称:默认命名空间和项目名称相同。
使用方法:用 “.” 来分割,但是不表示包含关系(理解成层次关系)。
特别注意:不能以数字、特殊字符开头,也不建议使用中文。
注意:引入命名空间时,如果两个类所在的命名空间不同,其中一个类使用另一个类,则要引入命名空间(使用using)活这 “限定名”。
注意:引入命名空间时,如果两个类所在类库不同,先引入类库,在引入命名空间。
类型 | 描述 | 范围 | 默认值 |
---|---|---|---|
bool | 布尔值 | True 或 False | False |
byte | 8 位无符号整数 | 0 到 255 | 0 |
char | 16 位 Unicode 字符 | U +0000 到 U +ffff | '\0' |
decimal | 128 位精确的十进制值,28-29 有效位数 | (-7.9 x 1028 到 7.9 x 1028) / 100 到 28 | 0.0M |
double | 64 位双精度浮点型 | (+/-)5.0 x 10-324 到 (+/-)1.7 x 10308 | 0.0D |
float | 32 位单精度浮点型 | -3.4 x 1038 到 + 3.4 x 1038 | 0.0F |
int | 32 位有符号整数类型 | -2,147,483,648 到 2,147,483,647 | 0 |
long | 64 位有符号整数类型 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 0L |
sbyte | 8 位有符号整数类型 | -128 到 127 | 0 |
short | 16 位有符号整数类型 | -32,768 到 32,767 | 0 |
uint | 32 位无符号整数类型 | 0 到 4,294,967,295 | 0 |
ulong | 64 位无符号整数类型 | 0 到 18,446,744,073,709,551,615 | 0 |
ushort | 16 位无符号整数类型 | 0 到 65,535 | 0 |
字符串类型、时间类型、引用类型、动态类型、对象类型.....这些数据类型后面需要慢慢接触哦....
概念:表示一个数据存储空间,地址的别名,内存地址是一串16进制数,非常不好记忆,通过变量可以快速找到数据。
变量的三要素:数据存储的类型、有意义好记忆、具体存储的数据。
变量使用方法:定义(声明)规定变量的数据类型和名称,赋具体的值,读取数据。
组成:英文字母(A-Z, a-z)、数组(0-9)、下划线(_),除此之外不能含有其他字符。
开头:只能以字符或下划线开头。
禁用:C#关键字(int、this、class)....特别注意:“$” 符号在C#中是不可以使用的。
名称:要有意义,尽量用英文名称,除了循环变量外,尽量不要用单个字符串,如a、b等。
区别:严格区分大小写Equipld和equipld是完全不同的变量。
原则:使用Camel命名法,首字母小写,比如equipldName、equild等(这里特指成员变量和局部变量)。
原则:使用Pascal命名法,首字母大写。
举例:EquipData(类名)、Equipld(属性)、GetData()(方法)。
方法 | 解释 |
---|---|
Console.Write(); | 将指定的字符串值写入标准输出流(不换行) |
Console.WriteLine(); | 将指定的字符串值写入标准输出流(换行) |
Console.Read(); | 从标准输入流中读取下一个字符 |
Console.ReadKey(); | 获取用户按下的下一个字符或功能键 |
Console.ReadLine(); | 从标准输入流读取下一行字符 |
static void TestCode()
{
Console.Write("请输入学员姓名: ");
string strName = Console.ReadLine();
Console.Write("请输入学员成绩:");
float strScore = float.Parse(Console.ReadLine());
// 这里float隐式转换成了字符串类型。
Console.WriteLine("姓名:" + strName + "成绩:" + strScore);
// 等待输入下一个。
Console.Read();
}
static void TestCode()
{
Console.Write("请输入学员姓名: ");
string strName = Console.ReadLine();
Console.Write("请输入学员成绩: ");
float strScore = float.Parse(Console.ReadLine());
Console.Write("请输入学员班级: ");
string strClass = Console.ReadLine();
// 普通的拼接方法
string strMsg1 = "姓名:" + strName + " 成绩:" + strScore + " 班级: " + strClass;
Console.WriteLine(strMsg1);
// 格式化方法1
string strMsg2 = string.Format("姓名: {0} 成绩: {1} 班级: {2}", strName, strScore, strClass);
Console.WriteLine(strMsg2);
// 格式话方法2
string strMsg3 = $"姓名: {strName} 成绩: {strScore} 班级: {strClass}";
Console.WriteLine(strMsg3);
Console.Read();
}
运算符 | 描述 | 实例 |
---|---|---|
+ | 把两个操作数相加 | A + B 将得到 30 |
- | 从第一个操作数中减去第二个操作数 | A - B 将得到 -10 |
* | 把两个操作数相乘 | A * B 将得到 200 |
/ | 分子除以分母 | B / A 将得到 2 |
% | 取模运算符,整除后的余数 | B % A 将得到 0 |
++ | 自增运算符,整数值增加 1 | A++ 将得到 11 |
-- | 自减运算符,整数值减少 1 | A-- 将得到 9 |
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个操作数的值是否相等,如果相等则条件为真。 | (A == B) 不为真。 |
!= | 检查两个操作数的值是否相等,如果不相等则条件为真。 | (A != B) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 | (A > B) 不为真。 |
< | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 | (A < B) 为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 | (A >= B) 不为真。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 | (A <= B) 为真。 |
运算符 | 描述 | 实例 |
---|---|---|
&& | 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 | (A && B) 为假。 |
|| | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | (A || B) 为真。 |
! | 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 | !(A && B) 为真。 |
& | 如果同时存在于两个操作数中,二进制 AND 运算符复制一位到结果中。 | (A & B) 将得到 12,即为 0000 1100 |
---|---|---|
| | 如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。 | (A | B) 将得到 61,即为 0011 1101 |
^ | 如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。 | (A ^ B) 将得到 49,即为 0011 0001 |
~ | 按位取反运算符是一元运算符,具有"翻转"位效果,即0变成1,1变成0,包括符号位。 | (~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。 |
<< | 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 | A << 2 将得到 240,即为 1111 0000 |
>> | 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 | A >> 2 将得到 15,即为 0000 1111 |
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | C = A + B 将把 A + B 的值赋给 C |
+= | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 | C += A 相当于 C = C + A |
-= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 | C -= A 相当于 C = C - A |
*= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 | C *= A 相当于 C = C * A |
/= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 | C /= A 相当于 C = C / A |
%= | 求模且赋值运算符,求两个操作数的模赋值给左边操作数 | C %= A 相当于 C = C % A |
<<= | 左移且赋值运算符 | C <<= 2 等同于 C = C << 2 |
>>= | 右移且赋值运算符 | C >>= 2 等同于 C = C >> 2 |
&= | 按位与且赋值运算符 | C &= 2 等同于 C = C & 2 |
^= | 按位异或且赋值运算符 | C ^= 2 等同于 C = C ^ 2 |
|= | 按位或且赋值运算符 | C |= 2 等同于 C = C | 2 |
运算符 | 描述 | 实例 |
---|---|---|
sizeof() | 返回数据类型的大小。 | sizeof(int),将返回 4. |
typeof() | 返回 class 的类型。 | typeof(StreamReader); |
& | 返回变量的地址。 | &a; 将得到变量的实际地址。 |
* | 变量的指针。 | *a; 将指向一个变量。 |
? : | 条件表达式 | 如果条件为真 ? 则为 X : 否则为 Y |
is | 判断对象是否为某一类型。 | If( Ford is Car) // 检查 Ford 是否是 Car 类的一个对象。 |
as | 强制转换,即使转换失败也不会抛出异常。 | Object obj = new StringReader("Hello"); StringReader r = obj as StringReader; |
// 举例:其他类型也类似
static void TestCode3()
{
// 隐式转换(自动类型转换)
byte b = 10;
int i = b; // 大的类型可以存放小的类型
// 隐式转换(自动类型转换)
int intValue = 42;
long longValue = intValue; // 大的类型可以存放小的类型
}
// 举例:其他类型也类似
static void TestCode3()
{
// 强制类型转换
double value1 = 3.14;
int value2 = (int)value1; // 这样导致丢失精度
// 强制类型转换
object value3 = 1314.12D;
int value4 = (int)(double)value3; // 因为object是一个引用类型,特殊的转换
}
// 举例:其他类型也类似
static void TestCode()
{
int a = int.Parse("1"); // 将数字的字符串表示形式转换为它的等效 32 位有符号整数。
int c = 0;
int.TryParse("2", out c); // 将数字的字符串表示形式转换为它的等效 32 位有符号整数。
// 如果 true 成功转换,则为 s;否则为 false。
int d = 123;
string str = d.ToString(); // 将此实例的数值转换为其等效的字符串表示形式。
}
序号 | Convert的方法 & 描述 |
---|---|
1 | ToBoolean 如果可能的话,把类型转换为布尔型。 |
2 | ToByte 把类型转换为字节类型。 |
3 | ToChar 如果可能的话,把类型转换为单个 Unicode 字符类型。 |
4 | ToDateTime 把类型(整数或字符串类型)转换为 日期-时间 结构。 |
5 | ToDecimal 把浮点型或整数类型转换为十进制类型。 |
6 | ToDouble 把类型转换为双精度浮点型。 |
7 | ToInt16 把类型转换为 16 位整数类型。 |
8 | ToInt32 把类型转换为 32 位整数类型。 |
9 | ToInt64 把类型转换为 64 位整数类型。 |
10 | ToSbyte 把类型转换为有符号字节类型。 |
11 | ToSingle 把类型转换为小浮点数类型。 |
12 | ToString 把类型转换为字符串类型。 |
13 | ToType 把类型转换为指定类型。 |
14 | ToUInt16 把类型转换为 16 位无符号整数类型。 |
15 | ToUInt32 把类型转换为 32 位无符号整数类型。 |
16 | ToUInt64 把类型转换为 64 位无符号整数类型。 |
// 举例:其他类型也类似
static void TestCode()
{
int a = Convert.ToInt32("1234");
float b = Convert.ToSingle("3.14");
double c = Convert.ToDouble("3.1415");
DateTime dt = Convert.ToDateTime("2023-09-12");
string str = Convert.ToString(dt);
}
语句 | 描述 |
---|---|
if 语句 | 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。 |
if...else 语句 | 一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。 |
嵌套 if 语句 | 您可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句。 |
switch 语句 | 一个 switch 语句允许测试一个变量等于多个值时的情况。 |
嵌套 switch 语句 | 您可以在一个 switch 语句内使用另一个 switch 语句。 |
可以用来替代 if...else 语句的三木运算符:
Exp1 ? Exp2 : Exp3;
// ? 表达式的值是由 Exp1 决定的。如果 Exp1 为真,则计算 Exp2 的值,结果即为整个 ? 表达式的值。如果 Exp1 为假,则计算 Exp3 的值,结果即为整个 ? 表达式的值。
循环类型 | 描述 |
---|---|
while 循环 | 当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件。 |
for/foreach 循环 | 多次执行一个语句序列,简化管理循环变量的代码。 |
do...while 循环 | 除了它是在循环主体结尾测试条件外,其他与 while 语句类似。 |
嵌套循环 | 您可以在 while、for 或 do..while 循环内使用一个或多个循环。 |
循环控制语句:
控制语句 | 描述 |
---|---|
break 语句 | 终止 loop 或 switch 语句,程序流将继续执行紧接着 loop 或 switch 的下一条语句。 |
continue 语句 | 跳过本轮循环,开始下一轮循环。 |