【C#】.Net基础语法一
目录
【1.1】Properties中AssemblyInfo文件
.Net基础语法一
一、程序集信息
主要是用来保存项目的说明信息和相关的版权信息。
【1.1】Properties中AssemblyInfo文件
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")]
程序集信息的修改方法一:同过上面代码对应下面的图进行修改:
程序集信息的修改方法二:
二、.Net程序的两次编译过程
三、.Net中命名空间和类
类的概念:在面向对象编程语言中,类是程序的基本单元,用类可以封装要处理的数据(属性、字段)和具体的处理过程(放法)。
一个程序的组成结构:
// 引用的命名空间。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
/// <summary>
/// 命名空间
/// <summary>
namespace App.ConsoleApp
{
/// <summary>
/// 类
/// </summary>
internal class Program
{
/// <summary>
/// 项目入口函数
/// </summary>
/// <param name="args"> 启动参数 </param>
static void Main(string[] args)
{
#region Test Code
Console.WriteLine("Hollo World!");
Console.ReadKey();
#endregion
}
}
}
【3.1】引入命名空间
// 引入命名空间的语法:
using FirstApp.Console;
// 用完全限定名的语法:<项目名> + <类名>
FirstApp.Console.TestClass testClass = new FirstApp.Console.TestClass();
【3.2】修改默认的命名空间
【3.3】命名空间的总结
-
必须要由:任何一个类都要属于一个命名空间。
-
用于管理:通过命名空间更好的对 “类” 进行分类管理。
-
自己规划:一个项目可以根据实际的需要,开发者自己划分若干命名空间。
-
默认名称:默认命名空间和项目名称相同。
-
使用方法:用 “.” 来分割,但是不表示包含关系(理解成层次关系)。
-
特别注意:不能以数字、特殊字符开头,也不建议使用中文。
注意:引入命名空间时,如果两个类所在的命名空间不同,其中一个类使用另一个类,则要引入命名空间(使用using)活这 “限定名”。
注意:引入命名空间时,如果两个类所在类库不同,先引入类库,在引入命名空间。
四、.Net中数据类型
【4.1】数值型
类型 | 描述 | 范围 | 默认值 |
---|---|---|---|
bool | 布尔值 | True 或 False | False |
byte | 8 位无符号整数 | 0 到 255 | 0 |
char | 16 位 Unicode 字符 | U +0000 到 U +ffff | '' |
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 |
【4.2】非数值型
字符串类型、时间类型、引用类型、动态类型、对象类型.....这些数据类型后面需要慢慢接触哦....
五、.Net中变量
概念:表示一个数据存储空间,地址的别名,内存地址是一串16进制数,非常不好记忆,通过变量可以快速找到数据。
变量的三要素:数据存储的类型、有意义好记忆、具体存储的数据。
变量使用方法:定义(声明)规定变量的数据类型和名称,赋具体的值,读取数据。
【5.1】变量命名规范
-
组成:英文字母(A-Z, a-z)、数组(0-9)、下划线(_),除此之外不能含有其他字符。
-
开头:只能以字符或下划线开头。
-
禁用:C#关键字(int、this、class)....特别注意:“$” 符号在C#中是不可以使用的。
-
名称:要有意义,尽量用英文名称,除了循环变量外,尽量不要用单个字符串,如a、b等。
-
区别:严格区分大小写Equipld和equipld是完全不同的变量。
-
原则:使用Camel命名法,首字母小写,比如equipldName、equild等(这里特指成员变量和局部变量)。
【5.2】类、属性、方法命名规范
-
原则:使用Pascal命名法,首字母大写。
-
举例:EquipData(类名)、Equipld(属性)、GetData()(方法)。
六、控制台输入输出
【6.1】基本输入输出
方法 | 解释 |
---|---|
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();
}
【6.2】字符串格式化方法
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();
}
七、运算符
【7.1】算数运算符
运算符 | 描述 | 实例 |
---|---|---|
+ | 把两个操作数相加 | A + B 将得到 30 |
- | 从第一个操作数中减去第二个操作数 | A - B 将得到 -10 |
* | 把两个操作数相乘 | A * B 将得到 200 |
/ | 分子除以分母 | B / A 将得到 2 |
% | 取模运算符,整除后的余数 | B % A 将得到 0 |
++ | 自增运算符,整数值增加 1 | A++ 将得到 11 |
-- | 自减运算符,整数值减少 1 | A-- 将得到 9 |
【7.2】关系运算符
运算符 | 描述 | 实例 |
---|---|---|
== | 检查两个操作数的值是否相等,如果相等则条件为真。 | (A == B) 不为真。 |
!= | 检查两个操作数的值是否相等,如果不相等则条件为真。 | (A != B) 为真。 |
> | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 | (A > B) 不为真。 |
< | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 | (A < B) 为真。 |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 | (A >= B) 不为真。 |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 | (A <= B) 为真。 |
【7.3】逻辑运算符
运算符 | 描述 | 实例 |
---|---|---|
&& | 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 | (A && B) 为假。 |
|| | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | (A || B) 为真。 |
! | 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 | !(A && B) 为真。 |
【7.4】位运算符
& | 如果同时存在于两个操作数中,二进制 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 |
【7.5】赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | 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 |
【7.6】其他运算符
运算符 | 描述 | 实例 |
---|---|---|
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; |
八、数据类型转换
【8.1】自动类型转换
// 举例:其他类型也类似
static void TestCode3()
{
// 隐式转换(自动类型转换)
byte b = 10;
int i = b; // 大的类型可以存放小的类型
// 隐式转换(自动类型转换)
int intValue = 42;
long longValue = intValue; // 大的类型可以存放小的类型
}
【8.2】强制类型转换
// 举例:其他类型也类似
static void TestCode3()
{
// 强制类型转换
double value1 = 3.14;
int value2 = (int)value1; // 这样导致丢失精度
// 强制类型转换
object value3 = 1314.12D;
int value4 = (int)(double)value3; // 因为object是一个引用类型,特殊的转换
}
【8.3】字符串与值类型转换
// 举例:其他类型也类似
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(); // 将此实例的数值转换为其等效的字符串表示形式。
}
【8.4】万能转换器
序号 | 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);
}
九、程序逻辑语句
【9.1】判断语句
语句 | 描述 |
---|---|
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 的值,结果即为整个 ? 表达式的值。
【9.2】循环语句
循环类型 | 描述 |
---|---|
while 循环 | 当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件。 |
for/foreach 循环 | 多次执行一个语句序列,简化管理循环变量的代码。 |
do...while 循环 | 除了它是在循环主体结尾测试条件外,其他与 while 语句类似。 |
嵌套循环 | 您可以在 while、for 或 do..while 循环内使用一个或多个循环。 |
循环控制语句:
控制语句 | 描述 |
---|---|
break 语句 | 终止 loop 或 switch 语句,程序流将继续执行紧接着 loop 或 switch 的下一条语句。 |
continue 语句 | 跳过本轮循环,开始下一轮循环。 |