C#中多重继承
原文:C#中多重继承
其实想写这篇文章,是因为突然在整理论坛上的帖子的时候,突然发现一个人问我如何才能在C#中实现多重继承,当时我答的很隐晦,因此这里我想补充说明一下.
首先,我要说明一下,C#中是没有类的多重继承这个概念.要使用多重继承必须要通过接口Interface来完成.可是大家都知道Interface实际上就是一个虚函数列表指针.内部封装的只有函数和属性.而且接口(Interface)不能实力化只能通过派生(因为没有构造函数)才可以使用.这一点和抽象类很类似,可是抽象类是个类,他有方法的实现.它所描述的对象是一个无法在现实中具现的对象,但它本身是个类对象.而接口实际上是一种标准.说了这么多,下面我来举一个例子如何在C#中实现多重继承.
例子:
using System;
namespace Intdv
{
/// <summary>
///
/// </summary>
public abstract class myBase
{
public myBase()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
}
}
using System;
namespace Intdv
{
/// <summary>
///
/// </summary>
public class myDerive1 : Intdv.myBase
{
string myName;
public myDerive1()
{
//
// TODO: 在此处添加构造函数逻辑
//
myName="yarshray";
}
public void ShowMyName()
{
Console.WriteLine("my name is :" + this.myName);
}
public void reName(string n)
{
myName=n;
}
}
public interface ImyDerive1
{
void ShowMyName();
void reName(string n);
}
}
using System;
namespace Intdv
{
/// <summary>
///
/// </summary>
public class myDerive2 : Intdv.myBase
{
int MyAge;
public myDerive2()
{
//
// TODO: 在此处添加构造函数逻辑
//
MyAge=21;
}
public void ShowMyAge()
{
Console.WriteLine("my age is :"+ MyAge);
}
public void reAge(int a)
{
MyAge=a;
}
}
public interface ImyDerive2
{
void ShowMyAge();
void reAge(int a);
}
}
using System;
namespace Intdv
{
/// <summary>
///
/// </summary>
public sealed class myMDerive : Intdv.myBase, Intdv.ImyDerive1,
Intdv.ImyDerive2
{
Intdv.myDerive1 d1;
Intdv.myDerive2 d2;
public myMDerive()
{
//
// TODO: 在此处添加构造函数逻辑
//
d1 =new myDerive1();
d2 =new myDerive2();
}
public void ShowMyName(){d1.ShowMyName();}
public void reName(string n){d1.reName(n);}
public void ShowMyAge(){d2.ShowMyAge();}
public void reAge(int a){d2.reAge(a);}
}
}
using System;
namespace Intdv
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
Intdv.myMDerive md=new myMDerive();
md.ShowMyAge();
md.ShowMyName();
md.reAge(22);
md.ShowMyAge();
md.reName("saga");
md.ShowMyName();
}
}
}
事例分析,首先我上在一开始定义了一个基类myBase,并派生出了两个派生类分别为myDerive1,myDerive2
这两个类分别定义了一组操作,myDerive1中定义了操作ShowMyName 和 reName 并通过接ImyDerive1加以
描述. myDerive2中定义了操作ShowMyAge 和 reAge 并通过接口ImyDerive2来描述,这样我在多重继承中
只用继承接口也就是ImyDerive1和ImyDerive2就可以保证操作列表的继承,操作的实现通过组合模型.在
接口方法中体现.这里还是从代码来说明,我的派生对象myMDerive(M即多从继承之意),虽然只继承了接口,
可是在构造函数中,却动态分配(New)了myDerive1 和 myDerive2 两个对象.并在操作ShowMyName
等接口继承来的操作中实际调用了myDerive1 和 myDerive2 的操作.由于myDerive1 和 myDerive2 是在
myMDerive内定义的,所以客户端代码(也就是我的主函数)并不需要管理对象的分配和释放(当然在CLR托管
环境中对象的释放一般也并非人为).
由以上例子,可以看出,实现借口留出函数接口具体实现通过组合的方式来实现多重继承中方法体的实现.这样既保证了单一继承父类的唯一性,又保证了多重继承的优点.我个人认为是个很不错的设计方法,并且在我的程序设计中很多地方都采用了该方法.那么好了,就到这里了.下次
CNBIE BLOG
C#中方法参数的四种类型
原文:C#中方法参数的四种类型
C#中方法的参数有四种类型:
-值参数:不含任何修饰符。方法中的形参是实参的一份拷贝,形参的改变不会影响到内存中实参的的值,实参是安全的。
-引用参数:以ref修饰符声明。传递的参数实际上是实参的指针,所以在方法中的操作都是直接对实参进行的,而不是复制一个值;可以利用这个方式在方法调用时双向传递参数;为了以ref方式使用参数,必须在方法声明和方法调用中都明确地指定ref关键字,并且实参变量在传递给方法前必须进行初始化。
-输出参数:以out修饰符声明。和ref类似,它也是直接对实参进行操作。在方法声明和方法调用时都必须明确地指定out关键字。out参数声明方式不要求变量传递给方法前进行初始化,因为它的含义只是用作输出目的。但是,在方法返回前,必须对out参数进行赋值。
-数组型参数:以params修饰符声明。params关键字用来声明可变长度的参数列表。方法声明中只能包含一个params参数。
using System;
class Test
{
static void F(params int[] args)
{
Console.WriteLine("Array contains {0} elements:",args.Length);
foreach(int i in args)
Console.Write("{0}",i);
Console.WriteLine();
}
public static void Main()
{
int [] a = {1,2,3};
F(a);
F(10,20,30,40);
F();
}
}
CNBIE BLOG
c#中分割字符串的几种方法
原文:c#中分割字符串的几种方法
最近经常看到论坛中许多帖子询问如何使用split来分割字符串,我这里对split做一些简单的总结,希望能够对大家有所帮助。下面介绍几种方法:
第一种方法:打开vs.net新建一个控制台项目。然后在Main()方法下输入下面的程序。
string s="abcdeabcdeabcde";
string[] sArray=s.Split('c');
foreach(string i in sArray)
Console.WriteLine(i.ToString());
输出下面的结果:ab
deab
deab
de
我们看到了结果是以一个指定的字符进行的分割。如果我们希望使用多个字符进行分割如c,d,e如何做呢?好,我们使用另一种构造方法:
更改为 string s="abcdeabcdeabcde
string[] sArray1=s.Split(new char[3]{'c','d','e'});
foreach(string i in sArray1)
Console.WriteLine(i.ToString());
可以输出下面的结果:ab
ab
ab
除了以上的这两种方法以外,第三种方法是使用正则表达式。新建一个控制台项目。然后先添加 using
System.Text.RegularExpressions;
Main() :中更改为
System.Text.RegularExpressions
string content="agcsmallmacsmallgggsmallytx";
string[]resultString=Regex.Split(content,"small",RegexOptions.IgnoreCase) foreach(string i in resultString) Console.WriteLine(i.ToString()); 输出下面的结果:agc mac ggg ytx使用正则表达式有什么好处呢? 别着急,后面我们会看到它的独特之处。下面介绍第4种方法。比如
string str1="我*****是*****一*****个*****教*****师";
如果我希望显示为:我是一个教师, ,如何作呢? 我们可以使用下面代码:
string str1="我*****是*****一*****个*****教*****师;
string[] str2;
str1=str1.Replace("*****","*");
str2=str1.Split('*');
foreach(string i in str2)
Console.WriteLine(i.ToString());
这样也可以得到正确结果。但是比如
string str1="我**是*****一*****个*****教*****师";
我希望显示的结果为:我是一个教师。
我如果采用上面的第四种方法来做就会产生下面的错误:我 是一个教师
中间有空格输出,所以输出结果并不是我希望的结果,如何解决呢?这就又回到了正则表达式了(这里可以看到它的功能强大之处),这时可以采用下面的第五种方法:
string str1="我**是*****一*****个*****教*****师";
string[] str2 =
System.Text.RegularExpressions.Regex.Split(str1,@"[*]+");
foreach(string i in str2)
Console.WriteLine(i.ToString());
这里通过"[*]+" 巧妙的完成了我们的目标。
上面介绍了c#中分割字符串的几种方法,如果大家有更好的方法欢迎与我交流:)
您可以在我的个人Blog 上留言 : http://cnblogs.com/redbb
CNBIE BLOG
c#中构建异常处理
原文:c#中构建异常处理
异常是程序运行中发生的错误,异常处理是程序设计的一部分。在c#中异常处理是通过Exception基类进行的,可以创建自己的异常类,但这个类必须是继承自Exception基类。
异常将导致不完善或者不需要的结果,因此在程序设计中需要处理异常。异常也可以是象"IndexOutOfBounds"这样的错误,这个错误表示程序试图访问数组中部存在的元素;比如数组最大元素为100,当试图访问元素101时就将会发生这样的错误。但这些都是内建的异常,可以直接通过Exception基类处理,如果发生的异常不是内建的,那么就需要我们自己见一个异常处理类,当然这个类时继承自Exception基类。
下面的程序定义了一个自己的异常类:
using System;
public class MyException:Exception
{
public string s;
public MyException():base()
{
s=null;
}
public MyException(string message):base()
{
s=message.ToString();
}
public MyException(string message,Exception
myNew):base(message,myNew)
{
s=message.ToString();// Stores new exception message into class
member s
}
public static void Test()
{
string str,stringmessage;
bool flag=false;
stringmessage=null;
char ch=' ';
int i=0;
Console.Write("Please enter some string (less than 27 characters) -
");
str=Console.ReadLine();
try{
ch=str[i];
while (flag==false)
{
if (ch=='\r')
{
flag=true;
}
else{
ch=str[i];
i++;
}
}
}
catch(Exception e){
flag=true;
}
if (i>27)
{
stringmessage="你的输入不能超过27个字 !";
throw new MyException(stringmessage);
}
}
public static void Main()
{
try
{
Test();
}
catch(MyException e)
{
Console.WriteLine(e.s);
}
}
}
上面的代码建立了一个新的继承于Exception基类的异常类叫MyException,这个类有三个过载构造函数,采用三个构造函数的目的十分简单:为了能够过载基类的构造函数。基类中缺省的和已经实现的构造函数必须在继承类中实现,但是我们设计这个类的真正目的是:当用户输入超过27
个字就显示一段错误提示信息,提醒用户输入不能超过27个字。虽然这更像是数据验证而不是一个真正的异常但却是一个比较好的例子,新的异常MyException被函数Test()抛出,通过该方法信息"你的输入不能超过27个字"被main()的catch块获得。
CNBIE BLOG
c#中结构与类的区别
原文:c#中结构与类的区别
目录
类与结构的实例比较
类与结构的差别
如何选择结构还是类
一.类与结构的示例比较:
结构示例:
public struct Person
{
string Name;
int height;
int weight
public bool overWeight()
{
//implement something
}
}
类示例:
public class TestTime
{
int hours;
int minutes;
int seconds;
public void passtime()
{
//implementation of behavior
}
}
调用过程:
public class Test
{
public static ovid Main
{
Person Myperson=new Person //声明结构
TestTime Mytime=New TestTime //声明类
}
}
从上面的例子中我们可以看到,类的声明和结构的声明非常类似,只是限定符后面是 struct 还是 class
的区别,而且使用时,定义新的结构和定义新的类的方法也非常类似。那么类和结构的具体区别是什么呢?
二 .类与结构的差别
1. 值类型与引用类型
结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string
结构 ,通过使用结构可以创建更多的值类型
类是引用类型:引用类型在堆上分配地址
堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑
因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用
注:
1.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object
2.虽然结构的初始化也使用了New
操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用
2.继承性
结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed .
类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承
注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样
例如:结构实现接口
interface IImage{ void Paint();} struct Picture : IImage{ public void Paint() { // painting code goes here } private int x, y, z; // other struct members}
3.内部结构:
结构:
没有默认的构造函数,但是可以添加构造函数
没有析构函数
没有 abstract 和 sealed(因为不能继承)
不能有protected 修饰符
可以不使用new 初始化
在结构中初始化实例字段是错误的
类:
有默认的构造函数
有析构函数
可以使用 abstract 和 sealed
有protected 修饰符
必须使用new 初始化
三.如何选择结构还是类
讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类
CNBIE BLOG
C#中奇妙的操作符重载
原文:C#中奇妙的操作符重载
C#
CNBIE BLOG
C#中如何处理鼠标事件
原文:C#中如何处理鼠标事件
C#中如何处理鼠标事件
编译/alpha2k2
vckbase.com/code/downcode.asp?id=2186">下载源代码
过去用 C++/MFC 开发程序时,常常为用户提供鼠标的右键单击功能,如今在 .NET 框架中使用
C#,也想在程序中提供鼠标右键单击功能,比如,在文本框、窗格、标签以及主窗口背景上使用鼠标右键。毕竟 C# 不是
C++/MFC,那么如何用 C# 处理鼠标事件呢?本文下面将专门探讨这个问题。
在 .NET 框架下编程是非常容易的一件事情,有时候容易得连 C++ 程序员想都想不到。这主要是因为用 C++
编写代码常常需要“硬工夫”。所谓“硬工夫”,也就是很多细节都要自己考虑和处理。但使用 C#
则不然。如果你想显示上下文菜单,完全没有必要去和事件参合。只要设置控制的 ContextMenu 属性即可,就象下面这样:
ContextMenu myContextMenu = ... myControl.ContextMenu = myContextMenu; 就这么简单。只要按照上述方法设置好属性,当用户单击右键时,菜单便会自动显示出来。此外,如果你想进一步实现右键拖拽,这才涉及到事件处理。在
MFC 中,你会自然而然想到用OnRButtonDown 和 OnRButtonUp 实现,但是那不是 Windows
窗体(Forms)的工作方式。虽然许多窗口类确实提供了可以改写的虚拟函数来处理常用消息(如:Form.OnActivated 和
Form.OnClosed),但是在.NET框架中编程,你必须要学会用事件来思考,而且要了解一个类提供了哪些事件。下面这个表列出了被
Control 类提供的比较常用的事件:
(表一)ClickHelpRequestedMouseLeave
ContextMenuChangedInvalidatedMouseMove
DoubleClickKeyDownMouseUp
DragDropKeyPressMouseWheel
DragEnterKeyUpMove
DragLeaveLayoutPaint
DragOverLeaveParentChanged
EnabledChangedLostFocusResize
EnterMouseDownSizeChanged
FontChangedMouseEnterStyleChanged
GotFocusMouseHoverTextChanged
注意表中用黑体标出的事件,这些事件顾名便可思意:MouseDown、 MouseEnter、 MouseHover、
MouseLeave、 MouseMove 和 MouseUp,如果你想要处理右键按下事件,可以安装 MouseDown
事件处理例程,用 MouseEventArgs.Button == MouseButtons.Right 检查
MouseEventArgs,下面的代码段示范了如何来做:
public class MyControl : Control{ // 构造函数 public MyControl() { // 安装右键按下事件处理器 this.myctl1.MouseDown += new MouseEventHandler(this.OnMouseDown); } // 处理例程 private void OnMouseDown(object sender, MouseEventArgs e) { if (e==MouseButtons.Right) // do something }} 表一里有三个有用的鼠标事件是在 MFC 中不能直接处理的:MouseEnter、 MouseHover 和 MouseLeave。在
Win32 里,要处理这些事件必须通过专门的 TrackMouseEvent 函数。.NET 框架
中,每当鼠标进入或离开特定控制时便会触发MouseEnter 和
MouseLeave,当你想在鼠标移动到控制上时使控制呈高亮状态,这些事件相当有用,例如在浏览器中高亮显示链接。当鼠标移动到控制上后,在预先确定好的时间里(这个时间由
SystemParametersInfo(SPI_GETMOUSEHOVERTIME)) 指定),.NET 框架会激活
MouseHover。它在 Tooltips 和其它类似的定时弹出式功能应用中广泛使用。
这些鼠标事件和大家所熟悉的 Click 事件有何关系呢?我想可以这么认为,Click
属于层次较高的逻辑事件,而鼠标事件的级别相对较低,例如,不管用户按下的是左键还是右键,Forms 都触发 Click 事件,而
文本框只能触发左键的 Click 事件。表二中列出了不同种类的控制其 Click 事件的含意。
(表二)由 Click 激发的事件控制或控件鼠标左键单击鼠标左键双击鼠标右键单击鼠标右键双击鼠标中键单击鼠标中键双击
MonthCalendar, DateTimePicker, RichTextBox, HScrollBar,
VScrollBarNoneNoneNoneNoneNoneNone
Button, CheckBox, RadioButtonClickClick, ClickNoneNoneNoneNone
ListBox, CheckedListBox, ComboBoxClickClick,
DoubleClickNoneNoneNoneNone
TextBox, DomainUpDown, NumericUpDownClickClick,
DoubleClickNoneNoneNoneNone
*TreeView, *ListView ClickClick, DoubleClickClickClick,
DoubleClickNoneNone
ProgressBar TrackBar ClickClick, ClickClickClick,
ClickClickClick, Click
Form, DataGrid, Label, LinkLabel, Panel,GroupBox, PictureBox,
Splitter, DoubleClick, StatusBar,ToolBar, TabPage,
**TabControlClickClick, DoubleClickClickClick,
DoubleClickClickClick, DoubleClick
* 鼠标指针必须在子对象上方 (TreeNode 或 ListViewItem)
** TabControl 必须在其 TabPages 页集合中至少有一个 TabPage。
最后,不管怎样,只要你愿意,总是可以改写 Control.WndProc 来处理任何 WM_XXX 消息,比如:你可以定制
WM_NCLBUTTONDOWN 消息处理代码:
protected override void WndProc(ref Message m) { // 值来自 winuser.h const int WM_NCLBUTTONDOWN = 0x00A1; if (m.Msg == WM_NCLBUTTONDOWN) { //do something } base.WndProc(ref m); // 这一步不能忘! } 我写了一个例子程序 MouseTrap,如图一所示,
图一 MouseEventTrap
该程序示范了如何进行鼠标事件的处理。如果你借 WndProc 处理消息,由于必须用 IntPtrs 获取消息参数,所以你或多或少要用 C
编程,但因为你已经谙熟 C++,所以此时你不会感觉吃力,而是轻车熟路。
CNBIE BLOG
C#中如何自定义事件?
原文:C#中如何自定义事件?
C# 中如何自定义事件?Wason (zhuhai) 本次只用一个实例,来说明在C#中如何使用自定义事件。写一个类,此类包含了自定义事件: onSendMsg。文件名:ChatServer.cspublic class ChatServer{public delegate void MyEventHandler(string msg);public event MyEventHandler onSendMsg;public void SendMsg(){onSendMsg("开始发送消息!");}}文件名:Form1.cs/////////////////////////////////////类事件的处理代码如下private void SendMsgTest(){//创建ChatServer类的实例Server f_Server;f_Server = new Server();f_Server.onSendMsg += new Server.MyEventHandler(this.OnSendMsg);//调用 f_Server的SendMsg()函数f_Server.SendMsg();}//处理 onSendMsg 事件代码protected void OnSendMsg(string msg){//输出调试信息Console.WriteLine(msg);}
CNBIE BLOG
C#中使用SendMessage
原文:C#中使用SendMessage
在C#中,程序采用了的驱动采用了事件驱动而不是原来的消息驱动,虽然.net框架提供的事件已经十分丰富,但是在以前的系统中定义了丰富的消息对系统的编程提供了方便的实现方法,因此在C#中使用消息有时候还是大大提高编程的效率的。
1 定义消息
在c#中消息需要定义成windows系统中的原始的16进制数字,比如
const int WM_Lbutton = 0x201; //定义了鼠标的左键点击消息
public const int USER = 0x0400 // 是windows系统定义的用户消息
2 消息发送
消息发送是通过windows提供的API函数SendMessage来实现的它的原型定义为
[DllImport("User32.dll",EntryPoint="SendMessage")]
private static extern int SendMessage(
int hWnd, // handle to destination window
int Msg, // message
int wParam, // first message parameter
int lParam // second message parameter
);
3 消息的接受
在C#中,任何一个窗口都有也消息的接收处理函数,就是defproc函数
你可以在form中重载该函数来处理消息
protected override void DefWndProc ( ref System.WinForms.Message m )
{
switch(m.msg)
{
case WM_Lbutton :
///string与MFC中的CString的Format函数的使用方法有所不同
string message = string.Format("收到消息!参数为:{0},{1}",m.wParam,m.lParam);
MessageBox.Show(message);///显示一个消息框
break;
default:
base.DefWndProc(ref m);///调用基类函数处理非自定义消息。
break;
}
}
其实,C#中的事件也是通过封装系统消息来实现的,如果你在DefWndProc函数中不处理该
那么,他会交给系统来处理该消息,系统便会通过代理来实现鼠标单击的处理函数,因此你可以通过
defproc函数来拦截消息,比如你想拦截某个按钮的单击消息
4 C#中其他的消息处理方法
在C#中有的时候需要对控件的消息进行预处理,比如你用owc的spreedsheet控件来处理Excel文件,你不想让用户可以随便选中
数据进行编辑,你就可以屏蔽掉鼠标事件,这个时候就必须拦截系统预先定义好的事件(这在MFC中称为子类化),你可以通过C#提供的一个接口
IMessageFilter来实现消息的过滤
public class Form1: System.Windows.Forms.Form,IMessageFilter
{
const int WM_MOUSEMOVE = 0x200
public bool PreFilterMessage(ref Message m)
{ Keys keyCode = (Keys)(int)m.WParam & Keys.KeyCode;
if(m.Msg == m.Msg==WM_MOUSEMOVE) //||m.Msg == WM_LBUTTONDOWN
{
//MessageBox.Show("Ignoring Escape...");
return true;
}
return false;
}
}
CNBIE BLOG
C#中数组,类型转换,
原文:C#中数组,类型转换,
当数据转换到asp.net页面时,大部分都是以文本的形式存在的。有时候为了输出,单单使用显示或者隐式转换都是不行的,就需要本节说到的数据转换。
字符串输出:
int intAge=21;
string strAge=intAge.ToString();
转换DateTime值时,可以通过在括号内放置一个可选的参数来指定时间的输出样式。eg:dateCou.ToString(“d“);
格式化代码及其含意:
D——以下列格式给出日月年:Thursday,september 21,2001
G——09/22/2001 09:12:23
T——给出时间:01:23:22 时 分 秒
t——给出时分:01:23
d——mm/dd/yyyy
数据输入
Convert函数大全:
Convert.ToBoolean();
Convert.ToByte();
Convert.ToChar();
Convert.ToDateTime();
Convert.ToDecimal();
Convert.ToDouble();
Convert.ToInt16();
Convert.ToInt32();
Convert.ToInt64();
Convert.ToSByte();
Convert.ToSingle();
Convert.ToUInt16();
Convert.ToUInt32();
Convert.ToUInt64();
七、常量
赋值:const int AbsoluteZero=-273;
必须在类定义中声明,而不能超脱类来定义。
八、结构化的数据类型
1、数组
声明一个数组:string [] strSZ;
为了生成一个已声明的数组,必须进行初始化:strSZ=new string[5];
声明的同时进行初始化:string [] asp=new string[44];
数组的下标从0开始。
变量的赋值:asp[0]=“sdf“;
asp[2]=“sdf“;
……
或者:
string [] asp=new string[]{“asdf“,“ASDFAS“};
string [] asp=new string[2]{“asdf“,“ASDFAS“};
string [] asp={“asdf“,“ASDFAS“};
看实例:
<s cript runat="Server" language="C#">
void Page_Load()
{
string[] strArrayDetails = new string[3];
int intLoop;
strArrayDetails[0] = text1.Text;
strArrayDetails[1] = text2.Text;
strArrayDetails[2] = text3.Text;
Message1.Text = strArrayDetails[0];
Message2.Text = strArrayDetails[1];
Message3.Text = strArrayDetails[2];
}
</s cript>
<html>
<head>
<title>Text Box Example</title>
</head>
<body>
<asp:label id="Message1" runat="server" />
<br />
<asp:label id="Message2" runat="server" />
<br />
<asp:label id="Message3" runat="server" />
<br />
<form runat="server">
Please enter your name:
<asp:textbox id="text1" runat="server" />
<br /><br />
Please enter your address:
<asp:textbox id="text2" runat="server" rows=5 textmode="multiline" />
<br /><br />
Please enter your chosen password:
<asp:textbox id="text3" runat="server" textmode="password" />
<br /><br />
<input type="Submit">
</form>
</body>
</html>
多维数组:
string [,] strStr1=new string[3,2];
c#不限制数组的大小,只有内存来限制它,然而在实际使用过程中,当有超过三维以上的数组时,就需要考虑其它的解决方案,比如对象。
不规则数组:
string [] strNre=new string[2][];
string strNre[0]=new string[8];
string strNre[1]=new string[2];
2、结构
定义:struct nameabc{……};
3、枚举
enum Gender{male=0,female=1};
浙公网安备 33010602011771号