C#教程快速入门(ArcGIS二次开发方向)

本文档详细介绍了C#的基础知识,包括值类型与引用类型的区别、传值与传址、字符串初始化、数组和字典操作、接口的定义与实现等。此外,还讲解了构造函数、多态、委托、事件驱动机制等内容,特别针对ArcGIS的二次开发提供了指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.值类型与引用类型的区别

int是值类型,特点是“除非赋值,否则两者毫不相干”

int a = 60;
int b = a;
a = 80;
MessageBox.Show("a:" + a. ToString());
MessageBox.Show("b:" + b.ToString());

输出结果:b = 60; a = 80(a!=b)

动态数组ArrayList是引用类型,一个引用类型指向一个内存数据。若多个引用类型都指向同一个内存数据,那么其中一个引用类型发生了改变,其余的引用类型都要随之改变。

ArrayList a = new ArrayList();  //定义了个引用类型a,指向一个内存数据
a.Add(1);
a.Add(5);
ArrayList b = a;           //定义了个引用类型b,但是把a赋给了b,所以现在引用类型b与a都指向了同一个内存数据
a[0] = 4;                  //引用类型a发生了改变
MessageBox.Show("a[0]:" + a[0].ToString());
MessageBox.Show("b[0]:" + b[0].ToString());  //a发生了改变,所以b也要改变,b[0] = a[0] = 4
MessageBox.Show("b[1]:" + b[1].ToString());  //b[1]还是等于a[1] = 5

输出结果:a[0] = 4; b[0] = 4(a[0]!=b[0]) b[1] = 5

2.传值和传址

(一)传值——值类型变量int char等

这类变量在调用函数时相当于复制实参的值到型参,函数内型参的变化和实参毫无关系

 private void Button1_Click(object sender, EventArgs e)
{
   
    int a = 5;
    int b = 7;
    int c = 8;//实参c的值为8
    toge(a, b, c);//把实参a, b, c的值复制一份给形参a, b, c
    MessageBox.Show("函数外的c值为:"+c.ToString());//形参的改变不影响实参
}
void toge(int a, int b, int c)//将实参a, b, c的值复制到型参的a, b, c中
{
   
    c = a + b;//形参c的值改变
    MessageBox.Show("函数内的c值为:"+c.ToString());
}

结果为:函数内的c值为:12 函数外的c值为:8

(二)传址——引用类型变量int [], Arraylist等

这类·变量在调用函数时是传递实参的地址给型参,这样形参改变,实参会随之改变

 private void Button2_Click(object sender, EventArgs e)
{
   
    int[] ay = new int[] {
    2, 3, 5 };
    aya(ay);//把数组ay的地址传递给形参
    MessageBox.Show("函数外ay[1]值为:" + ay[1].ToString());
}
void aya(int []ay)
{
   
    ay[1] = 8;//形参ay[1]改变,由于地址关联所以对应实参ay[1]的值也要改变
    MessageBox.Show("函数内ay[1]值为:" + ay[1].ToString());
}

结果为:函数内ay[1]的值为:8 函数外ay[1]的值为:8

(三)传址——值类型变量int char等

原本值类型只能传值不能传址,但是调用函数的形参和实参前面都加上ref就可以对该变量传址

 private void Button3_Click(object sender, EventArgs e)
{
   
     char a = 'a';
     char b = 'b';
     int c = 'a' + 'b';
     sayo(a, b, ref c);
 //把实参a, b的值复制一份给形参a, b;实参c前面加上ref就把c的地址传递给形参c
     MessageBox.Show("函数外的c值为:" + c.ToString());
 }
 void sayo(char a, char b, ref int c)//形参c前面加上ref
 {
   
      c = a + b - 1;//形参c的值改变,由于加了ref所以实参的c也会改变
     MessageBox.Show("函数内的c值为:" + c.ToString());
 }

结果为:函数外的c值为:194 函数内的c值为:194

(四)ref和out的区别

值类型变量在调用函数时,在形参和实参前加上ref或者out都可以将该值类型变量转换为引用类型变量,不用ref和out又有所不同:
1、调用前赋值
ref作为参数的函数在调用前,实参必须赋初始值。
out作为参数的函数在调用前,实参可以不赋初始值。

2、函数中,参数赋值
在调用函数中,out引入的参数必须赋值;
而ref引入的参数在返回前可以不赋值;

比较完整的代码为:


3.初始化字符串string

C#中初始化字符串的代码为string a = "abc";类似于C语言中的char a[] = "abc";

4.输出字符串MessageBox.Show(“字符串”+a);

string a = "abc";
MessageBox.Show("a = "+a);

输出结果为:a = abc

当然也可以不加字符串,直接调用字符串然后输出

string a = "abc";
MessageBox.Show(a);  //省去了加号+,后面的输出单个字符也可以这样做

输出结果为:abc

MessageBox.Show( )也可以输出单个字符,不过括号里面要加上一个函数.ToString()

.ToString()将单个字符转换为字符串形式
string a = "abc";
int f = 'a';
MessageBox.Show("a = "+a);
MessageBox.Show("f = "+f.Tostring());

输出结果为:a = abc f = 98

5.连接两个字符串;两个字符;字符与字符串“+”

连接两个字符串

string a = "Hello";
string b = " World";
string c = a + b;
MessageBox.Show(c);

输出结果:Hello World

连接两个字符

int a = 'a';
int b = 'b';
int c = a + b;
MessageBox.Show(c.ToString());

输出结果为:175 两个字符相连,仍然是一个字符

连接字符与字符串

string a = "Hello";
int b = 'b';
string c = a + b;
MessageBox.Show(c);

输出结果为:Hello98 字符与字符串相连,结果是一个字符串

6.bool类型

一个条件语句可以被赋给一个bool类型的变量,若条件语句结果为真,则变量的返回值为True;反之若条件语句结果为假,则变量的返回值为False。
bool类型变量的返回值为单个字符类型

int a = 100;
int b = 120;
bool c = a < b;   //可替换为 a > b
if(c)
{
   
 	MessageBox.Show("c = " + c.ToString());
}
else
{
   
	MessageBox.Show("c = " + c.ToString());
}

当a < b时,条件语句为假,输出结果:c = False
当a > b时,条件语句为真,输出结果:c = True

7.is运算符: bool a = ‘operand’ is ‘type’;

is运算符是可以检查对象是否是给定的类型,或者是否可以转换为给定的类型。如果是,这个运算符就返回True;如果不是,这个运算符就返回False.

  • 如果type是一个类类型,而operand也是该类型,或者它继承了该类型,或者它封箱到该类型中,则结果为true。

  • 如果type是一个接口类型,而operand也是该类型,或者它实现了该接口的类型,则结果为true。

  • 如果type是一个值类型,而operand也是该类型,或者它被拆箱到该类型中,则结果为true。

int a = 100;
int b = 120;
bool c = a is double;  //若改成a is int会怎样
if(c)
{
   
	MessageBox.Show("Yes, you're right!");
}
else
{
   
	MessageBox.Show("No, you're wrong!");
                
}
MessageBox.Show(c.ToString());

a是int类型,不是double类型,故输出结果为:No, you’re wrong! False
若改成了a is int,则输出结果为:Yes, you’re right! True

8.数组的初始化

数组可以理解为同一类型的变量按照行、列组合在一起的集合。数组和字符串在C语言里性质是差不多的(字符串又叫做字符数组),字符串是char str[12];,数组是int str[12]; int str[2][3];

(一)一维数组

方法一

int []ay = new int[3];
ay[0] = 12;
ay[1] = 14;
ay[2] = 16;

方法二:

int []ay = new int[]{
   12, 14, 16};
(二)二维数组
int [,]ay = new int[2,2];
ay[0,0] = 10;
ay[0,1] = 12;
ay[1,0] = 14;
ay[1,1] = 16;

9.字典Dictionary<key, value>

(一)初始化和删除
Dictionary<string, double> data = new Dictionary<string, double>();
data  [ "圆周率" ] = 3.141593;
data["第一"] = 1.423;<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值