C#入门(1):程序结构、数据类型
一、C#程序结构
第一个C#程序
using System;
namespace base_01
{
class Program
{
#region 代码折叠块
static void Main(string[] args)
{
//控制台输出
Console.WriteLine("Hello World!");
Console.Write("C#是微软的编程语言"); //不换行输出
//Console.ReadKey(); //控制台等待,VS2017之后的高版本不需要这句
}
#endregion
}
}
代码说明:
(1)每个程序只能有一个Main方法,且使用static修饰;
(2)#region 代码折叠块, #endregion可以实现代码块折叠;
(3)C#需要引用命名空间,类似于C++添加头文件,命名空间里有相关类。例如Console是System名字空间里的类;
(4)控制台输出:C#使用Console.WriteLine在控制台输出文本,它可以输出各种数据类型的值,包括 string
、int
、double
等。以下是一些常用的 Console.WriteLine
写法。
-
输出字符串:
Console.WriteLine("Hello, World!");
-
输出变量的值:
string name = "John"; Console.WriteLine(name); // Outputs "John"
-
使用占位符输出变量的值:
int age = 30; Console.WriteLine("I am {0} years old.", age); // Outputs "I am 30 years old."
在这个例子中,
{0}
是一个占位符,它会被age
变量的值替换。 -
输出多个变量的值:
string name = "John"; int age = 30; Console.WriteLine("My name is {0} and I am {1} years old.", name, age); // Outputs "My name is John and I am 30 years old."
-
输出数值:
Console.WriteLine(123); // Outputs "123" Console.WriteLine(123.45); // Outputs "123.45"
-
输出布尔值:
Console.WriteLine(true); // Outputs "True"
-
输出对象的字符串表示(通常是通过调用对象的
ToString()
方法得到的):DateTime now = DateTime.Now; Console.WriteLine(now); // Outputs the current date and time
-
$
输出符
C# 6.0 引入了一种新的字符串插值语法,允许在字符串中直接包含表达式。这种语法使用$
符号在字符串前面声明。表达式用{}
包围,并直接在字符串中插入。
以下是一些使用 $
进行字符串插值的例子:
string name = "John";
Console.WriteLine($"Hello, {name}!"); // Outputs "Hello, John!"
int age = 30;
Console.WriteLine($"I am {age} years old."); // Outputs "I am 30 years old."
double pi = Math.PI;
Console.WriteLine($"Pi is approximately {pi}."); // Outputs "Pi is approximately 3.14159265358979."
DateTime now = DateTime.Now;
Console.WriteLine($"The current date and time is {now}."); // Outputs the current date and time
在这些例子中,{name}
、{age}
、{pi}
和 {now}
是表达式,它们会被它们的值替换。
此外,你还可以在 {}
中包含复杂的表达式,甚至是格式字符串:
double pi = Math.PI;
Console.WriteLine($"Pi to 2 decimal places is {pi:F2}."); // Outputs "Pi to 2 decimal places is 3.14."
在这个例子中,:F2
是一个格式字符串,它指示 pi
的值应该以固定点数(即小数)的形式显示,并且小数部分应该有两位。
总的来说,Console.WriteLine
是一个非常灵活的方法,可以用来输出各种类型的数据,并且支持多种格式的输出。
二、C#代码注释
(1)3个斜线然后回车可以注释方法。
(2)2个斜线普通注释
(3)/**/
多行注释
三、变量命名规则
在C#中,变量命名遵循一些基本规则和规范:
-
合法字符:变量名可以包含字母、数字和下划线。但是,变量名必须以字母或下划线开头,不能以数字开头。
-
区分大小写:C#是大小写敏感的编程语言,这意味着
myVariable
和MyVariable
在C#中会被视为两个不同的变量。 -
关键字:你不能使用C#的关键字(如
int
,double
,if
等)作为变量名。如果你想用关键字作为变量名,可以在关键字前加上@
符号,例如@int
。但一般来说,这并不是一个好的做法。 -
长度:理论上,变量名的长度没有限制,但是为了代码的清晰性,最好保持变量名在合理的长度。
-
有意义的名称:变量名应该描述它所存储数据的内容或用途。使用有意义的变量名可以提高代码的可读性。
除了这些基本规则之外,还有一些命名规范通常在C#编程中被遵循:
-
PascalCase:在C#中,常量和类型名(如类名和枚举名)通常遵循PascalCase命名规范,即每个单词的首字母大写,例如
MyClass
,MaxValue
。 -
camelCase:局部变量和方法参数通常遵循camelCase命名规范,即第一个单词的首字母小写,后续单词的首字母大写,例如
myVariable
,maxValue
。
这些规则和规范有助于保持代码的清晰性和一致性,尤其是在大型项目或团队工作中。
四、C# 数据类型
在C#中,数据类型被分为两种主要类型:值类型(Value types)和引用类型(Reference types)。这两种类型的主要区别在于它们存储和访问数据的方式。
值类型
值类型(Value types)直接包含数据。比如整数,浮点数,布尔值,字符和结构等。值类型的变量保存实际的数据值。当你把一个值类型的变量赋值给另一个值类型的变量时,实际上是复制了一份数据,两个变量可以独立变化,互不影响。
C#中的基本值类型有:
- 整型:
sbyte
,byte
,short
,ushort
,int
,uint
,long
,ulong
- 浮点型:
float
,double
- 十进制类型:
decimal
- 布尔型:
bool
- 字符型:
char
- 结构型:
struct
,enum
示例代码
下面是一些示例代码:
int number = 10; // 整型
float rate = 4.5f; // 浮点型
bool flag = true; // 布尔型
char letter = 'A'; // 字符型
decimal price = 19.95m; // 十进制类型
// 枚举(enum)
enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat };
// 结构(struct)
struct Point
{
public int X;
public int Y;
}
enum用法
假设我们有一个表示一周中的天的枚举,并且我们在一个名为Schedule
的类中使用这个枚举。我们可以创建一个方法来输出今天是星期几:
public enum DayOfWeek
{
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
}
public class Schedule
{
public DayOfWeek Day { get; set; }
public void PrintDay()
{
Console.WriteLine($"Today is {Day}.");
}
}
在上述代码中,Schedule
类有一个Day
属性,其类型为DayOfWeek
枚举。PrintDay
方法会输出Day
的值。
然后,你可以在Main
方法中创建一个Schedule
对象,并测试这个方法:
class Program
{
static void Main()
{
Schedule schedule = new Schedule();
schedule.Day = DayOfWeek.Monday;
schedule.PrintDay(); // Outputs "Today is Monday."
schedule.Day = DayOfWeek.Friday;
schedule.PrintDay(); // Outputs "Today is Friday."
}
}
在这个例子中,我们首先设置Day
为DayOfWeek.Monday
,然后调用PrintDay
方法,它会输出"Today is Monday.“。然后我们将Day
改为DayOfWeek.Friday
,并再次调用PrintDay
方法,它会输出"Today is Friday.”。
decimal用法
decimal
是C#中用于存储十进制数的数据类型。它是一种值类型,通常用于需要高精度的数值运算,比如财务计算和货币计算。decimal
类型的范围是±1.0 x 10^-28 至 ±7.9228 x 10^28。同时,它可以存储最多28位的小数,这比其他任何浮点数据类型都要精确。
创建并初始化一个 decimal
变量的语法如下:
decimal price = 19.95m;
注意,我们在数值后面添加了 m
或者 M
后缀,这是声明 decimal
类型变量的必要语法。
decimal
类型支持以下运算符: +
, -
, *
, /
, %
。以下是一些例子:
decimal price = 19.95m;
decimal discount = 0.15m; // 15% discount
decimal discountedPrice = price - (price * discount); // Calculate discounted price
decimal
类型也支持比较操作符,如 ==
, !=
, <
, >
, <=
, >=
。例如:
decimal price1 = 19.95m;
decimal price2 = 20.00m;
if (price1 < price2)
{
Console.WriteLine("price1 is less than price2.");
}
总的来说,decimal
类型是C#中最精确的数值类型,它非常适合用于需要精确计算的场合,尤其是在计算财务数据时。
引用类型
引用类型(Reference types)不直接包含数据;相反,它们包含对内存位置的引用,这个内存位置包含实际数据。这意味着当你把一个引用类型的变量赋值给另一个引用类型的变量时,实际上是复制了引用,两个变量指向同一个内存位置,改变其中一个变量会影响到另一个变量。
C#中的基本引用类型有:
- 类(Class)
- 接口(Interface)
- 委托(Delegate)
- 数组
下面是一些示例代码:
// 类(Class)
class MyClass
{
public int Number;
public string Name;
}
// 接口(Interface)
interface IMyInterface
{
void MyMethod();
}
// 委托(Delegate)
delegate void MyDelegate(int x);
// 数组
int[] numbers = new int[5];
这就是C#中的基本数据类型,值类型和引用类型的介绍和代码示例。
五、const与readonly
const用法
在C#中,const
关键字用于声明常量,即它的值在定义后不能更改。const
字段或局部变量必须在声明时赋值,而且值必须是编译时常量。
以下是一些使用const
声明常量的例子:
const int MyIntConstant = 10;
const double MyDoubleConstant = 3.14;
const string MyStringConstant = "Hello, World!";
在这些例子中,MyIntConstant
、MyDoubleConstant
和MyStringConstant
都被声明为常量,并在声明时被赋予值。这些值在后续的代码中不能被更改。
值得注意的是,const
关键字只能用于值类型(如int
、double
、bool
等)和字符串类型。对于引用类型(如类和数组),你不能使用const
,但可以使用readonly
关键字来创建其值不能更改的变量。
总的来说,const
关键字提供了一种方式来创建在编译时已知并且在程序运行时不会改变的值。这对于定义像数学常数(如π)或者固定的配置值等不会改变的值非常有用。
readonly
readonly
关键字用于声明在对象的生命周期内其值不会改变的字段。readonly
字段可以在声明时或在构造函数中初始化。readonly
可以应用于任何类型,包括用户定义的类和结构,也可以应用于数组(但是,虽然不能更改数组引用,但可以更改数组元素)。
例如:
public class MyClass
{
public readonly int MyField;
public MyClass(int value)
{
MyField = value;
}
}
在这个例子中,MyField
在构造函数中被初始化,然后在对象的生命周期内其值不会改变。
总结一下,const
和readonly
都用于创建不能更改的变量,但它们的主要区别在于:
const
变量的值必须在编译时就知道,而readonly
变量的值可以在运行时确定。const
只能用于值类型,枚举类型,string
或null
,而readonly
可以用于任何类型。const
变量总是静态的,而readonly
变量可以是静态的也可以是实例的。const
变量在定义后就不能更改,而readonly
变量可以在声明时或在构造函数中更改。