=========================response.write("script")脚本输出
Response.Write("<script>alert('写入成功');location='WriteXml.xml';</script>");//location=:跳转到writeXml.xml页,比如页面显示时
===============================DataGridView
--------------------------------清空
this.dataGridView1.DataSource = null;
------------------------------------自定义变量Tag
this.Tag = this.dataGridView1.CurrentRow.Cells["读者编号"].Value.ToString();
FormReader_Update update = new FormReader_Update(this.Tag.ToString());
update.ShowDialog();
------------------------------------------绑定数据库
/// <summary>
/// DataGridView1绑定数据库
/// </summary>
private void BindDB()
{
string sql = " select * from view_BrrowandBackInfo where IsBack=0";
if (this.txtReaderID.Text.Trim() != "")
{
sql+=" and readerid like '%"+this.txtReaderID.Text.Trim()+"%'";
}
if (this.txtReaderName.Text.Trim() != "")
{
sql += " and name like'%" + this.txtReaderName.Text.Trim() + "%'";
}
//
if (this.txtBookName.Text.Trim() != "")
{
sql += " and BookName like'%" + this.txtBookName.Text.Trim() + "%'";
}
if (this.txtBookID.Text.Trim() != "")
{
sql += " and bookcode like'%" + this.txtBookID.Text.Trim() + "%'";
}
DataTable dt = DB.DataSet_fromSource(sql);
this.dataGridView1.AutoGenerateColumns = false;
this.dataGridView1.DataSource = dt;
=====================================ComboBox
---------------------------绑定ComboBox
public static void ComboBoxBind(object oComboBox, DataSet SourceDS, string DisplaySection, string ValueSection)
{
if (oComboBox == null || SourceDS == null)
{
return;
}
if (oComboBox is ComboBox)
{
//((ComboBox)oComboBox).Items.Clear();
((ComboBox)oComboBox).DisplayMember = DisplaySection;
((ComboBox)oComboBox).ValueMember = ValueSection;
((ComboBox)oComboBox).DataSource = SourceDS.Tables[0];
if (((ComboBox)oComboBox).Items.Count > 0)
{
((ComboBox)oComboBox).SelectedIndex = 0;
}
}
}
-----------------------------------------------comboBox列表添加初始值
string[] columnName = info.QueryColumnName_CboList(13);
for (int i = 0; i < columnName.Length; i++)
{
this.cboQuery.Items.Add(columnName[i]);
}
this.ActiveControl = this.cboQuery;
this.cboQuery.Text = "查询条件";
====================================F3F4快捷键============================
if (e.KeyCode==Keys.F3)
{
FormBorrow borrow = new FormBorrow();
borrow.ShowDialog();
}
====================================点击通知图标事件
private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
{
if (this.WindowState==FormWindowState.Maximized)
{
if(e.Button==MouseButtons.Left)
{
this.WindowState = FormWindowState.Minimized;
}
}
else if(this.WindowState==FormWindowState.Minimized)
{
if (e.Button==MouseButtons.Left)
{
this.WindowState = FormWindowState.Maximized;
}
}
}
====================================程序只能在一台机上运行一个实using System.Threading;
static void Main()
{
bool initiallyOwned = true;
bool isCreated;
Mutex m = new Mutex(initiallyOwned,"MyTest",out isCreated);
if (!(initiallyOwned && isCreated))
{
MessageBox.Show("抱歉,程序只能在一台机上运行一个实例!","提示");
Application.Exit();
}
else
{
Application.Run(new MainForm());
}
}
====================================文本框按下键并释放后发生============================
private void txtBookName_KeyPress(object sender, KeyPressEventArgs e)
{
this.KeyPress_BindDB();
if (e.KeyChar == 13)
{
this.BindDB();
}
}
-------------------------------------
/// <summary>
/// 重新加载数据库(根据查询条件)公共方法
/// </summary>
private void KeyPress_BindDB()
{
this.BindDB();
}
--------------------------------------
/// <summary>
/// DataGridView1绑定数据库
/// </summary>
private void BindDB()
{
string sql = " select * from view_BrrowandBackInfo where IsBack=0";
if (this.txtReaderID.Text.Trim() != "")
{
sql+=" and readerid like '%"+this.txtReaderID.Text.Trim()+"%'";
}
if (this.txtReaderName.Text.Trim() != "")
{
sql += " and name like'%" + this.txtReaderName.Text.Trim() + "%'";
}
//
if (this.txtBookName.Text.Trim() != "")
{
sql += " and BookName like'%" + this.txtBookName.Text.Trim() + "%'";
}
if (this.txtBookID.Text.Trim() != "")
{
sql += " and bookcode like'%" + this.txtBookID.Text.Trim() + "%'";
}
DataTable dt = DB.DataSet_fromSource(sql);
this.dataGridView1.AutoGenerateColumns = false;
this.dataGridView1.DataSource = dt;
====================================保存按钮 添加一条记录============================
保存按钮 添加记录
private void btnSave_Click_1(object sender, EventArgs e)
{
try
{
this.Add();
int row = info.InsertDataBase();
if (row > 0)
{
MessageBox.Show("添加成功", "添加", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("添加失败", "添加", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
catch (FormatException fe)
{
this.label15.Text = "输 入 格 式 错 误 !";
return;
}
catch (Exception ex)
{
this.label15.Text = "输 入 有 错 误 !";
return;
}
}
====================================sqlParams实参============================
/// <summary>
/// 图书添加一条记录
/// </summary>
/// <returns></returns>
public int InsertDataBase()
{
decimal price = Convert.ToDecimal(price1);
int page = Convert.ToInt32(page1);
int storage = Convert.ToInt32(storage1);
DateTime inTime = Convert.ToDateTime(inTime1);
int borrownum = Convert.ToInt32(borrownum1);
SqlParameter[] pars = new SqlParameter[13];
pars[0] = new SqlParameter("@bookcode", bookcode);
pars[1] = new SqlParameter("@bookname", bookname);
pars[2] = new SqlParameter("@type", type);
pars[3] = new SqlParameter("@author", author);
pars[4] = new SqlParameter("@translator", translator);
pars[5] = new SqlParameter("@pubname", pubname);
pars[6] = new SqlParameter("@price", price);
pars[7] = new SqlParameter("@page", page);
pars[8] = new SqlParameter("@bcase", bcase);
pars[9] = new SqlParameter("@storage", storage);
pars[10] = new SqlParameter("@inTime", inTime);
pars[11] = new SqlParameter("@oper", oper);
pars[12] = new SqlParameter("@borrownum", borrownum);
string strCmd = "insert into tb_bookinfo(bookcode,bookname,type,author,translator,pubname,price,page,bcase,storage,inTime,oper,borrownum)";
strCmd += "values(@bookcode,@bookname,@type,@author,@translator,@pubname,@price,@page, @bcase,@storage,@inTime,@oper,@borrownum)";
return DB.ExecuteSqlDataBase(strCmd, pars);
}
====================================HELP============================
#region 菜单栏(帮助: 帮助按钮)
private void toolStripMenuItem3_Click_1(object sender, EventArgs e)
{
string sn = Application.StartupPath;
string s11 = "../../../../help/newproject.chm";//往后退4级
Help.ShowHelp(this, s11);
}
#endregion
====================================电子表格============================
private void excel_Click(object sender, EventArgs e)
{
try
{
System.Diagnostics.Process.Start("excel.exe");
}
catch(Exception ex)
{
ex.Message.ToString();
}
}
计算器
private void calc_Click(object sender, EventArgs e)
{
try
{
System.Diagnostics.Process.Start("calc.exe");
}
catch(Exception ex)
{
ex.Message.ToString();
}
}
记事本
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
System.Diagnostics.Process.Start("notepad.exe");
}
catch(Exception ex)
{
ex.Message.ToString();
}
}
====================================模糊查询============================
/// <summary>
/// DataGridView1绑定数据库
/// </summary>
private void BindDB()
{
string sql = " select * from view_BrrowandBackInfo where IsBack=0";
if (this.txtReaderID.Text.Trim() != "")
{
sql+=" and readerid like '%"+this.txtReaderID.Text.Trim()+"%'";
}
if (this.txtReaderName.Text.Trim() != "")
{
sql += " and name like'%" + this.txtReaderName.Text.Trim() + "%'";
}
//
if (this.txtBookName.Text.Trim() != "")
{
sql += " and BookName like'%" + this.txtBookName.Text.Trim() + "%'";
}
if (this.txtBookID.Text.Trim() != "")
{
sql += " and bookcode like'%" + this.txtBookID.Text.Trim() + "%'";
}
DataTable dt = DB.DataSet_fromSource(sql);
this.dataGridView1.AutoGenerateColumns = false;
this.dataGridView1.DataSource = dt;
=================================删除一行记录 private void delete_Click(object sender, EventArgs e)
{
try
{
this.Tag = this.dataGridView1.CurrentRow.Cells[0].Value.ToString();//当前行的id值
this.dataGridView1.AllowUserToDeleteRows = true;
DialogResult result = MessageBox.Show("确定要删除该行记录吗?", "删除", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
if (result == DialogResult.OK)
{
int row = DB.Update_toSqlDataBase("delete from tb_bookcase where id='" + this.Tag.ToString()+"'");
if (row > 0)
{
this.Bind_DataBase();//重新绑定数据库
}
else
{
MessageBox.Show("删除失败", "删除", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
catch (Exception exc)
{
this.CatchException(exc);
}
}
===================================网站连接控件
private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
try
{
this.VisitLink();
}
catch(Exception ex)
{
ex.Message.ToString();
}
}
#endregion
#region 网站连接
/// <summary>
/// 网站连接
/// </summary>
private void VisitLink()
{
this.linkLabel1.LinkVisited = true;
System.Diagnostics.Process.Start("http://www.microsoft.com");
}
===================================选中整行单元格
this.dataGridView1.ReadOnly = true;
this.dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
==================================双引号单引号嵌套
" ' " " ' "//规则:交叉使用:如双引号里要用引号就用单引号,如单引号里再引号就用双引号
Response.Write("<script language='javascript'>alert('"+((LinkButton)e.Item.FindControl("accept")).Text+"')</script>");
=========================================c#理论
1. 能用foreach遍历访问的对象需要实现(IEnumerable)接口或声明(GetEnumerator)方法的类型。
存值效率高,存字符串效率低如:低:string="",string=String.Emply
高:string.Length=0
------------------------------------
== 栈中值是否相同
多个catch:只捕捉其中的一个,即只执行一个catch,一次只会发生一种异常,不会同时发生多个异常
索引器:何时用:set get单个私量赋值,索引器:私量为数组,Hashtable 时,可用,有参赋值
索引器:类中有多个不同类型的字段,可另定义一个类,类中用索引器(多参),对上个类查找,存取
.抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能
飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。
2. 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。 门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。
Interface:Can-do我能开车 能飞
abstract;Is-a我是司机 是飞行员
is:手动抛出异常时用 is不会抛出异常
as:不抛出异常时用
return:没有返回值时:跳出方法体
:return 1表示『函数正常结束』
return 0 表示『函数异常中止,不保证系统状态一致性』
方法对象new时, 方法有构造器,有属性set:先执行构造器中第一个变量,接着对应的set
而且通过set赋值
abstract class表示的是"is a"关系,interface表示的是"like a"关系
abstract:类中可以有抽象方法等,也可以有普通方法(有主体)
抽象方法等必须在抽象类中
子类必须实现父类abstract中的抽象方法等,而子类必须实现接口中的所有成员
接口只能有方法,属性,索引器,事件
抽象类主要用于设计大的功能单元;而接口用于设计小而简练的功能块。
==比较栈,所以值一般==
equals:比较堆中引用对象,一般引用equals
break:跳出最内层循环,return:跳出方法体return只能在方法中
continue:遇到,它下面的不执行,重新挞代
goto少用
符数组转换成字符串:用string的构造方法
继承父类,先执行父类的,再执行子类的构造方法
is as:类型转换操作符is:判断bool值 as:转换 用于引用类型
---------------------------------------------
as稍微不同,它检查引用对象是否兼容,如果不兼容则返回null,因此需要做null的判断
as要做null判断,as为引用,类型兼容返回非空,否则返回空
//值转换
基本数据类型转换用:covent
字符串类型转换:parse
子类转为父类:隐式转换
父类转子类:显式转
值类型和引用类型的转换采用装箱(boxing)或拆箱(unboxing
GetType可以取得对象的精确类型
引用类型转换
is:检查对象是否与给定类型兼容 返回true false 值
引用 as用于在兼容的引用类型之间执行转换 返回null !null 所以要判断是否为null
protected:基类子类 中用;Main中不能访问基类中的protected成员,子类可访问基类中的成员
Main中不能访问基类子类中的受保护只在基类子类间有权
sizeof()用于值类型获取字节数
struct:值类型 不能继承另外的类或结构,但要继承接口
class:引用 可继承另外的类或构
override: 覆盖了基类虚方法,直接输出子类中方法
new:重写基类中的虚方法,但是new为新建方法,但又继承基类虚方法,只输出基类中的虚方法,并没对基类方法重写,只是方法名相同
this:引用类的当前实例
类中字段要实例化,所以interface不能有字段
---------------------------------------------------
arr
数组为引用类型,但new了后,在内存中开辟空间有实值,
class只继承一个class,
-----------------------
class a:o
{}
class b:a
{}
错误
-----------------
class 可继承多个接口
vs中:
类视图:层次结构
解决方案意资源管理器:树结构
服务管理器:连接数据库管理
---------
f5调试
ctrl+f5执行
Show.Dialog():为模态对话框
------------------------------------------------------------------------
一个操作数在两个有相同优先级的操作符之间时,从左至右执行
二进制操作符左结合,赋值操作符,条件操作符右结合,x=y=z,(?:)
is判断是否为指定的类型 类型判断
as将一个值显式的转换成引用 类型 类型转换
逻辑与逻辑或为二元操作数,逻辑非一元操作数
自增自减操作符是一个变量,5++非法 后缀境减为整个表达式执行完后再增减
--------------
int i=5;
i=i++;
console.write(i);i=5;
int i=5;
解析为
int n=i++;
console.write(n);n=5;
int i=5;
i=i+++3+4;
console.write(i);i=5;i=12后缀境减为整个表达式执行完后再增减
typeof:获取系统原型对象的类型
移位运算比乘法运算快
两个不同空间调用,要引用-添加项目之后才能用
异常类基类:System.Exception
try{goto a;}
finally{}
a:
结果try,finally,a finally一定执行
c面向过程
c#面向对象 面向对象=对象+类+继承+通信
abstract类不能实例
protected 受保护的,可访问区:基类级基类的派生类
this使用域:构造函数,类方法,类实例
类构造函数中出现this作为一个值类型,表示对正在构造 的对象本身的引用
类方法中出现this作为一个值 类型, 表示对调用该方法的对象的引用
---------
结构构造函数或方法中出现this作为变量类型,表示对正在构造或调用 该方法的结构的引用
this定义为常量this++,this--非法
static成员属于类所有的,非static成员属于类实例-对象
继承:低级的继承高级的
public()
{}
internal():public
{}
默认构造函数:base()
构造函数默认为public,如为private表明类不能实例化,通常 用于含有静态成员的类
c#类是对数据结构的封装与抽象
类实例超出作用域时,析函数释放分配给该实例的任何存储区
return ; 返回void型
static方法只能访问类中static成员
非static方法可访问类中任何成员
不能重载的操作符:= && || ?: new typeof sizeof is
类功能通过类方法完成
int默认为=0
static域实例只初始化一次 不重新初始化,值也不累积
非static每次实例,都重新初始化,初始化后直到未重新初始化前将值累积
const型表达式的值在编译时形成,
static readonly表达式值在运行时形成
系统为每个未初始化的变量提供一个默认值
静态变量,非静态变量的对象变量,数组元素,这些变量自动初始化为本身的默认值,引用类型的变量,默认为null
---------
值类型变量 的默认值:
sbyte,byte,short ushort,int,uint,long,ulong 默认值0
char /x0000
float 0.0f
double 0.0d
decimal 0.0m
bool false
enum 0
struct类型的变量,默认初始化将对构成该结构的每个值类型初始化为上表中的默认值,对构成的每个引用类型初始化为null
类中,没有显式的对域初始化,系统将赋予一个默认值,静态域,类在装载时初始化,非静态域,实例创建时初始化,在默认初始化之前,域的值不可预测
属性体现了对象的封装性
接口只包括:方法,属性,事件,索引器
描述一个类的特性方式:域,属性 域通过public类型的成员变量访问,属性通过访问器访问
面向对象语言特性:继承,多态
多态:同一操作作用于不同对象,有不同解释,产生不同执行结果,
多态通过派生类重载基类中虚方法实现
队了构造函数,析构函数,派生类隐式继承直接基类的所有成员:基类成员:方法,域,属性,事件,索引器
类基类object 派生类对基类的扩展
构造函数,析构函数不能继承,其他都能继承
base:派生类调用基类
多态:编译时多态:通过重载实现,非虚的成员来说,编译时,根据传递的参数,返回类型决定实现操作 特点:运行速度快,
运行时多太:系统运行时,根据实际情况决定实现何种操作,运行时多态通过虚成员实现 特点:高度灵活和抽象
virtual override虚方法,在派生类中重写了基类的虚方法,执行时不执行基类中虚方法,因已被 派生类重写,只执行override方法 编译时值为virtual方法 编译时多态 运行时值为oerride方法,运行时多态
定义有参构造函数时,好习惯为把默认无参构造函数显式写出
------------------------------------
属性是访问字段值的一种灵活机制,其更好的实现了数据的封装和隐藏
在c#中可自定义属性
属性关键字为get set
说法问题:父类派生子类
子类调用父类 不是父类调用子类
struct不支持继承.它是隐式的从Object派生的 ,不能继承任何类或者结构体.但是可以实现接口.
结构体没有析构方法,不能初始化
从System.ValueType继承
结构中定义的字段,只能在构造函数中初始化,不能在定义的时候初始化;
结构不能显式的定义无参数的构造函数;
如:
struct Person
{
///string Name = "Study Struct"; //这是错误的
string Name;
/*下面的构造函数是错误的
public Person()
{
}
*/
public Person(string name)
{
Name = name;
}
}
3.与类的区别:
(1)结构是值类型,不是引用类型。
(2)结构可以继续接口,但是不可以继承类或结构。
(3)结构的构造方法的工作方式有所不同,只能声明带参数的构造方法,且不能声明析构方法。
(4)可以指定字段如何在内存中布局。
网站:博客园,51cto
4.什么时候使用(struct)结构:
虽然我们可以用(class)类完全代替(struct)结构,但是为了程序的性能的提高,建议大家在以下情况下使用结构:
建议大家在实现一个用于存储数据或数据量较小的结构时来使用结构,因为结构是值类型,所以在性能的影响上,是能起到正面作用的。
5.声明:
struct Users
{
public string UserName;
public string UserSex;
public int UserAge;
/// <summary>
/// Users结构的构造方法
/// </summary>
/// <param name="username"></param>
/// <param name="usersex"></param>
/// <param name="userage"></param>
public Users(string username, string usersex, int userage)
{
this.UserName = username;
this.UserSex = usersex;
this.UserAge = userage;
}
/// <summary>
/// 得到用户信息
/// </summary>
public void GetInfo()
{
Console.WriteLine("姓名:{0},性别:{1},年龄:{2}", UserName, UserSex, UserAge);
}
}
6.使用
方法一:
static void Main()
{
Users user;
user.UserName = "张三丰";
user.UserSex = "女";
user.UserAge = 18;
user.GetInfo();
}
方法二:
static void Main()
{
Users user = new Users("张三丰","男",29);
user.GetInfo();
}
------------------------------== equals
s1 = new String("sony"); //串对象:引用比较堆中值
s1.equals("sony"); //返回true
s1 == "sony";//s1对象 “sony”值 false
//如果
s1 = "sony";//值
s1 == "sony";//值 true
------------------------------------------------
string str = "this is a string.";
string strCopy = string.Copy(str);
bool testbool = ((object)str == (object)strCopy);
Console.WriteLine(testbool);//false
判断引用相等== 判断值相等equals(object)
引用不等 值相等
删除表中一个字段用drop 删除一个表也用drop
alter talbe userInfo drop column userName drop talbe userInfo
sql中:like '_p%'查询条件中表示_p开头%表示_p后面不定个数的所有符合条件的 以_开头,第二个字母是p
sql:Max(col_name)表示:最大值 avg平均值 Sum()总数 count()记录数
select * from employee where empid like '[0-9][0-9][_]%':查询字段empid中以2个数字开头第三个字符是下划线的所有记录
聚合函数不能在where子句中用
t_sql:数字不用括在单引号中
sql server自动提交事务为:默认的事务处理模式
sql:将一组语句执行20次用循环while
存储过程中的传出参数用output关键字
从游标中提取上次提取行之前的行:fetch frior:frior:在前面的 英语要快学
Console.Write(Math.Round(3.325, 2)); //小数后第三位数<=4舍 >=6入 四舍六入五凑偶函数 5前面数奇娄时入1凑成偶数,如是偶数则不入
foreach遍历访问的对象要实现(Ienumerable)接口或声明(GetEnumerator)方法
如果将窗体的FormBoderStyle设置为None,则窗体无边框但能调整大小
winform窗体概念:窗体是控件 窗体是类 窗体父类是控件类继承ContainerControl
表student(id,name,sex,age)字段name有重复记录,删除字段name中重名的记录,保留一条记录
delete * from student where name in(select name from student group by name having count(name)>1 )
struct:默认修饰符:private
int默认值为0 string null bool false
-------------------------------------------------------------
值:存放数据 数据在栈
引用:存放地址,即对象的引用 地址在栈,数据在堆
共同点:都是在栈上创建的,只是存放不同而已
-------------
f11进入方法体
f10不进方法体
C#类和接口、虚方法和抽象方法及值类型和引用类型的区别
1.C#类和接口的区别
接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!
而类是负责功能的具体实现!
在类中也有抽象类的定义,抽象类与接口的区别在于:
抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步
的专业化。
但接口是一个行为的规范,里面的所有东西都是抽象的!
一个类只可以继承一个基类也就是父类,但可以实现多个接口
PS:接口除了规范一个行为之外,在具体项目中的实际作用也是十分重要的,在面向对象的设计原
则以及设计模式的使用中,无不体现作为一个接口的使用好处,最直接的就是设计原则中OCP(开放
封闭原则),我们使用接口,而不需要关心他的具体实现,具体实现的细节变化也无关客户端(使
用接口的类)的使用,对与扩展是开放的,我们可以另写一个接口的实现来扩展当前程序,而不影
响上层的使用,但对修改是封闭的,即我们不能够再去修改接口的定义,当然这个“不能够”是指
在规范原则上不应该这么做!
2.抽象类和接口的区别
答:
抽象类(abstract class)可以包含功能定义和实现,接口(interface)只能包含功能定义
抽象类是从一系列相关对象中抽象出来的概念, 因此反映的是事物的内部共性;接口是为了满足外
部调用而定义的一个功能约定, 因此反映的是事物的外部特性
分析对象,提炼内部共性形成抽象类,用以表示对象本质,即“是什么”
为外部提供调用或功能需要扩充时优先使用接口
3. C#语言中,值类型和引用类型有何不同?
解答
值类型和引用类型的区别在于,值类型的变量直接存放实际的数据,而引用类型的变量存放的
则是数据的地址,即对象的引用。
值类型变量直接把变量的值保存在堆栈中,引用类型的变量把实际数据的地址保存在堆栈中,
而实际数据则保存在堆中。注意,堆和堆栈是两个不同的概念,在内存中的存储位置也不相同,堆
一般用于存储可变长度的数据,如字符串类型;而堆栈则用于存储固定长度的数据,如整型类型的数
据int(每个int变量占用四个字节)。由数据存储的位置可以得知,当把一个值变量赋给另一个值变
量时,会在堆栈中保存两个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保
存对同一个堆位置的两个引用,即在堆栈中保存的是同一个堆的地址。在进行数据操作时,对于值
类型,由于每个变量都有自己的值,因此对一个变量的操作不会影响到其它变量;对于引用类型的变
量,对一个变量的数据进行操作就是对这个变量在堆中的数据进行操作,如果两个引用类型的变量
引用同一个对象,实际含义就是它们在堆栈中保存的堆的地址相同,因此对一个变量的操作就会影
响到引用同一个对象的另一个变量。
4.结构和类的区别
解答
1) 结构是一个值类型,保存在栈上,而类是一个引用类型,保存在受管制的堆上。
2) 对结构中的数据进行操作比对类或对象中的数据进行操作速度要快。
3) 一般用结构存储多种类型的数据,当创建一个很多类或对象共用的小型对象时,使用结构效
率更高。
4.抽象方法和虚方法的区别
抽象方法
使用abstract关键字 public abstract bool Withdraw(…);
抽象方法是必须被派生类覆写的方法。
抽象方法是可以看成是没有实现体的虚方法
如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一般方法
虚方法
使用virtual关键字 public virtual bool Withdraw(…);
调用虚方法,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方法。
虚方法可以有实现体
---------------------------------------------------------------------------------------
------
虚拟方法和抽象方法有什么区别?
抽象方法只有声明没有实现,需要在子类中实现;虚拟方法有声明和实现,并且可以在子类中覆
盖,也可以不覆盖使用父类的默认实现
虚拟方法有实现代码
抽象方法则没有,
并且抽象类不能被实例化,只能实例化实现了全部抽象方法的派生类
抽象方法是虚拟方法的一种
抽象方法没有实现,它的存在只是为派生类统一接口;派生类应该实现这个方法
如果编写一个基类,它永远不会被实现,那么就应该将这个类中的一个或多个方法定义为
抽象方法。
抽象方法只有声明没有实现,需要在子类中实现;虚拟方法有声明和实现,并且可以在子类中覆
盖,也可以不覆盖使用父类的默认实现
补充一点
只允许在抽象类中使用抽象方法声明
学习
其实大家首先要搞清楚,虚方法与多态性关系密切,虚方法允许派生类完全或部分重写该类的方
法,需写方法体。抽象类中可以包含抽象方法与一般的方法,抽象类不可以new,抽象方法只是一个
定义,没有方法体,也就是没有{},也不要在里面写内容。它们两个相像的一点是都用override重
写
麻雀虽小,五脏俱全,大程序分析时,要分成多个小程序分析,才能理解其思想,一个命令很明白
后,要书面总结写出核心用法,这样思想会很清楚。
return:执行方法中的第一个return,return后面的不执行
谁调用的return方法,就把结果返回谁
continue:循环中遇到continue时,他之后语句的不执行,直接返回循环递增处进行下一次循环,
if elseif:要么执行if 要么执行else if 只执行其中一个
if if 有可能全部执行;一个接一个执行
递归:先回推:执行到函数处重新到函数开始,一直到终止条件为止,
执行递归上面的部分
再递推:从函数递归处开始,到方法尾,循环直到递归开始时的条件止,
执行递归下面的部分
-------------------------------------------
接口:能做什么
抽象类:是什么
as稍微不同,它检查引用对象是否兼容,如果不兼容则返回null,因此需要做null的判断
as要做null判断,as为引用,类型兼容返回非空,否则返回空
//值转换
基本数据类型转换用:covent
字符串类型转换:parse
子类转为父类:隐式转换
父类转子类:显式转
值类型和引用类型的转换采用装箱(boxing)或拆箱(unboxing
GetType可以取得对象的精确类型
引用类型转换
is:检查对象是否与给定类型兼容 返回true false 值
引用 as用于在兼容的引用类型之间执行转换 返回null !null 所以要判断是否为null
protected:基类子类 中用;Main中不能访问基类中的protected成员,子类可访问基类中的成员
Main中不能访问基类子类中的受保护只在基类子类间有权
sizeof()用于值类型获取字节数
struct:值类型 不能继承另外的类或结构,但要继承接口
class:引用 可继承另外的类或构
override: 覆盖了基类虚方法,直接输出子类中方法
new:重写基类中的虚方法,但是new为新建方法,但又继承基类虚方法,只输出基类中的虚方法,并
没对基类方法重写,只是方法名相同
this:引用类的当前实例
类中字段要实例化,所以interface不能有字段
------------------------------------
//构造函数:字段变量为public
私量(属性)访问器:字段变量为private
类:1:先执行static构造函数,且只执行一次
2:再执行默认无参构造函数,
3:再执行有参构造函数,
static构造器作用:对类的static成员初始化
构造器作用:对类的public成员初始化
set作用:对类的private成员初始化赋值
static器,析构器无参:不能被其他调用,为自动调用,为private私有
属性器:无参,private
索引器:有参,private 都是为private字段读写 字段为数组字段
多态实现:方法1:虚方法
方法重载:参数个数不同或参数类型不同
方法重写:方法同名同参,只加 关键字;父类:virtual 派生类:override
多态:不同类对象可调用相同信息
不同的 调用同一个(相同的)
虚方法来重写:前提:类要继承父类
子类有参构造函数继承父类构造函数:是子类形参传给父类形参
c#参数默认为引用类型,不加ref,为值传递,值传递是开辟各自的内存空间,加ref,为引用传递地
址,引用为同一个内存地址,通过地址找到值
ref:传入,传出
out:传出
ref,out只对方法参数用
方法同名同参:重写
方法同名不同参:重载
out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时
候。
ref ,out 不能同时重载一个方法。
当希望方法返回多个值时,声明 out 方法非常有用
一个类只能继承一个基类,但可以同时继承多个接口
abstract virtual:基类中需要有一个实现的部分时,用virtual,否则用abstract
索引器同属性,有参属性
委托就是一个类,任何类都可声明委托
equals比较的是堆中内容,对同一对象的引用
== 栈中值是否相同
多个catch:只捕捉其中的一个,即只执行一个catch,一次只会发生一种异常,不会同时发生多个异
常
索引器:何时用:set get单个私量赋值,索引器:私量为数组,Hashtable 时,可用,有参赋值
索引器:类中有多个不同类型的字段,可另定义一个类,类中用索引器(多参),对上个类查找,
存取
.抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能
飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象
类。
2. 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的
铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可
以有门铃(多实现)。 门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最
好只能做一件事,你不能要求锁也能发出声音吧(接口污染))。
Interface:Can-do我能开车 能飞
abstract;Is-a我是司机 是飞行员
is:手动抛出异常时用 is不会抛出异常
as:不抛出异常时用
return:没有返回值时:跳出方法体
:return 1表示『函数正常结束』
return 0 表示『函数异常中止,不保证系统状态一致性』
方法对象new时, 方法有构造器,有属性set:先执行构造器中第一个变量,接着对应的set
而且通过set赋值
abstract class表示的是"is a"关系,interface表示的是"like a"关系
abstract:类中可以有抽象方法等,也可以有普通方法(有主体)
抽象方法等必须在抽象类中
子类必须实现父类abstract中的抽象方法等,而子类必须实现接口中的所有成员
接口只能有方法,属性,索引器,事件
抽象类主要用于设计大的功能单元;而接口用于设计小而简练的功能块。
==比较栈,所以值一般==
equals:比较堆中引用对象,一般引用equals
break:跳出最内层循环,return:跳出方法体return只能在方法中
continue:遇到,它下面的不执行,重新挞代
goto少用
符数组转换成字符串:用string的构造方法
继承父类,先执行父类的,再执行子类的构造方法
is as:类型转换操作符is:判断bool值 as:转换 用于引用类型
ado.net:ExecuteScalar()连接的,读取并返回一个值 只返回一个值,效率最高
ExecuteReader() 只读
ExecutenonoQuery() 只写
DataSets() 断开的 读/写
dataset填充之后,连接就关闭
c#编程习惯:接口i开头,exception类用exception结尾 public class MyExeception(){}
有返回值的方法Get开头:GetObject(){}
类{}放在一新行上class a()
{
}
equals():引用指向同一对象 指向同一地址,比较和查询时用此方法
exception:分2类systemexception
applictionexception
自定义异常继承excetion总类就可
try catch finaly如果catch中中断,finaly不执行,因为中断,
----------------------------------------------
数组为引用类型,但new了后,在内存中开辟空间有实值,
class只继承一个class,
-----------------------
class a:o
{}
class b:a
{}
错误
-----------------
class 可继承多个接口
vs中:
类视图:层次结构
解决方案意资源管理器:树结构
服务管理器:连接数据库管理
---------
f5调试
ctrl+f5执行
Show.Dialog():为模态对话框
------------------------------------------
c#8种整数类型:sbyte,byte,short,ushort,int,uint,long,ulong u:为无符号整数,为正整数
否则为正负整数
int默认为int, 实数默认为double
enum每个元素默认为int类型 为enum赋值类型限制为整形
引用定义:引用类型的变量存储地址,通过地址指向存储的值
c#引用类型4种:类,代表(委托delegate),数组,接口
定义一个类变量,称它为一个类的实例
所有类基类:object 继承基类:base 本类this,数组类型基类:System.Array
装箱:值类型隐式转换成object类型 值到对象,栈到堆
拆箱;将一个对象类型显式转换成值类型,
变量命名规范:开头字母:字母,下划线,或@,后面为字母,下划线,数字
变量必须先定义后使用,给一个定义但未赋值的变量赋值时,必须是在一段可执行的代码中
静态变量的初始值为其类型的默认值,静态变量直到它所属的类运行结束时一直存在
一个类的新实例被 创建,直支类实例不再应用从而所在空间释放为止,非静态变量 一直存在
结构类型中的非静态变量随结构的存在而存在,即:结构类型中的变量存在或结束时,结构类型中
的变量随之存在或结束
数组变量随数组实例的存在而存在,数组元素的默认值 为数组类型的默认值
局部变量不会被自动初始化,也就没有默认值
const类型为任何一种值类型或引用类型
string,bool不能数据类型转换
.net是一个开发平台,c#是一种语言,vs.net是一种开发工具
struct:默认类型:private int默认值(初始值):0 引用类型变量初始值:null
object.ReferenceEquals:是否引用同一处的实例 引用处是否相同,是否是同一处
object.Equals:引用的实例值是否相同
--------------
is 类型判断
as 类型转换
typeof()获取系统类型
sizeof()获取大小,即字节数
----------------------------------
封装:就是把class内部隐藏起来,继承,多态
抽象接口什么时候用,一般用接口
------------------------------------------------------
一个操作数在两个有相同优先级的操作符之间时,从左至右执行
二进制操作符左结合,赋值操作符,条件操作符右结合,x=y=z,(?:)
is判断是否为指定的类型 类型判断
as将一个值显式的转换成引用 类型 类型转换
逻辑与逻辑或为二元操作数,逻辑非一元操作数
自增自减操作符是一个变量,5++非法 后缀境减为整个表达式执行完后再增减
--------------
int i=5;
i=i++;
console.write(i);i=5;
int i=5;
解析为
int n=i++;
console.write(n);n=5;
int i=5;
i=i+++3+4;
console.write(i);i=5;i=12后缀境减为整个表达式执行完后再增减
typeof:获取系统原型对象的类型
移位运算比乘法运算快
两个不同空间调用,要引用-添加项目之后才能用
异常类基类:System.Exception
try{goto a;}
finally{}
a:
结果try,finally,a finally一定执行
c面向过程
c#面向对象 面向对象=对象+类+继承+通信
abstract类不能实例
protected 受保护的,可访问区:基类级基类的派生类
this使用域:构造函数,类方法,类实例
类构造函数中出现this作为一个值类型,表示对正在构造 的对象本身的引用
类方法中出现this作为一个值 类型, 表示对调用该方法的对象的引用
---------
结构构造函数或方法中出现this作为变量类型,表示对正在构造或调用 该方法的结构的引用
this定义为常量this++,this--非法
static成员属于类所有的,非static成员属于类实例-对象
继承:低级的继承高级的
public()
{}
internal():public
{}
默认构造函数:base()
构造函数默认为public,如为private表明类不能实例化,通常 用于含有静态成员的类
c#类是对数据结构的封装与抽象
类实例超出作用域时,析函数释放分配给该实例的任何存储区
return ; 返回void型
static方法只能访问类中static成员
非static方法可访问类中任何成员
不能重载的操作符:= && || ?: new typeof sizeof is
类功能通过类方法完成
int默认为=0
static域实例只初始化一次 不重新初始化,值也不累积
非static每次实例,都重新初始化,初始化后直到未重新初始化前将值累积
const型表达式的值在编译时形成,
static readonly表达式值在运行时形成
系统为每个未初始化的变量提供一个默认值
静态变量,非静态变量的对象变量,数组元素,这些变量自动初始化为本身的默认值,引用类型的
变量,默认为null
---------
值类型变量 的默认值:
sbyte,byte,short ushort,int,uint,long,ulong 默认值0
char /x0000
float 0.0f
double 0.0d
decimal 0.0m
bool false
enum 0
struct类型的变量,默认初始化将对构成该结构的每个值类型初始化为上表中的默认值,对构成的
每个引用类型初始化为null
类中,没有显式的对域初始化,系统将赋予一个默认值,静态域,类在装载时初始化,非静态域,
实例创建时初始化,在默认初始化之前,域的值不可预测
属性体现了对象的封装性
接口只包括:方法,属性,事件,索引器
描述一个类的特性方式:域,属性 域通过public类型的成员变量访问,属性通过访问器访问
面向对象语言特性:继承,多态
多态:同一操作作用于不同对象,有不同解释,产生不同执行结果,
多态通过派生类重载基类中虚方法实现
队了构造函数,析构函数,派生类隐式继承直接基类的所有成员:基类成员:方法,域,属性,事
件,索引器
类基类object 派生类对基类的扩展
构造函数,析构函数不能继承,其他都能继承
base:派生类调用基类
多态:编译时多态:通过重载实现,非虚的成员来说,编译时,根据传递的参数,返回类型决定实
现操作 特点:运行速度快,
运行时多太:系统运行时,根据实际情况决定实现何种操作,运行时多态通过虚成员实现
特点:高度灵活和抽象
virtual override虚方法,在派生类中重写了基类的虚方法,执行时不执行基类中虚方法,因已被
派生类重写,只执行override方法 编译时值为virtual方法 编译时多态 运行时值为
oerride方法,运行时多态
定义有参构造函数时,好习惯为把默认无参构造函数显式写出
-----------------------------------------------
2个类成员;属性:描述状态
方法:定义行为
类在物理上打包在程序集中assembly
try catch finaly正确答案:catch中return中断, finaly照样执行,前面.txt中有说不执行,错
误的
调试时,即时窗口内输入,,回车,如:ds.tables[0].rows.count;=10行
编程:结构+算法
int x;
x=42;
console.Write(x++);//输出42+
调试:跳入方法体 f11
跳出方法体shift+f11
-----------------------------------
不同方式的赋值:int k = new int();
k = 100;
----------
int默认赋值为0 string:null输出时为' '空,空一空格,
------------------------------
virtual 选执行虚方法
override 再执行重载的方法
子类继承基类,可对基类的字段,方法进行操作
----------------------------
==================================字符串替换方法
/// <summary>
/// 旧字符替换为新字符如;"a"替换为"b"
/// </summary>
/// <param name="s">形参旧串</param>
/// <returns>新字符串</returns>
public static string tosql(string s)
{
return s.Replace("'","''");
}