面向对象程序设计
public:同一程序集中的任何其他代码或引用该程序集的其他程序集都可以访问该类型的成员。
protected:只有同一类或结构或者此类的派生类中的代码可以访问的类型成员。
private:只有同一类或结构中的代码可以访问该类型或成员。
interval:同一程序集中的任何代码都可以访问该类型的成员,但其他程序集中的代码不可以访问。
params:表示参数是可变个数的。在方法声明中的params关键字之后不允许任何参数,并且在方法声明中只允许一个params关键字。
(1)若形参表中含一个参数数组,则该参数数组必须位于形参列表的最后。
(2)参数数组必须是一维数组。
(3)不允许params与ref和out组合使用。
(4)与参数数组对应的实参可以是同一类型的数组名,也可以是任意多个属于同一类型变量的该数组的元素。
(5)若实参是数组按引用传递,若实参是变量或表达式按值传递。
static:
(1)类的静态成员属于类所有,非静态成员属于类的实例所有。
(2)每创建一个类的实例,都会在内存中为其分配一块存储区。
(3)静态成员存储在全局数据区。
(4)static成员方法或成员变量在类未实例化前即可使用。
(5)非静态方法可访问类中任何成员,静态方法只能访问静态成员。
MVC
1、目录结构
App_Data:数据库文件
Content:静态文件(样式文件、图片等)
Models:模型组件
View:视图组件
Controllers:控制器组件
Shared:视图组件中的公用部分。该目录不属于单个控制器,而是属于所有控制器。存放母版页等。
每个控制器,在View文件夹中都有一个与控制器名称相对应的目录。例如有HomeController则Views文件夹中就要创建一个Home的目录,这样HomeController加载相关视图时,就自动寻找Views/Home目录下的页面。
2、控制器给视图传递数据
(1)ViewData:只能在一个动作方法中设置,在相关的视图页面中读取,只对当前的视图页面有效。
(2)TempData:可在多个动作方法中或多个页面中设置,读取。
(3)Model
(4)传递多个数据对象:定义一个类,将多个数据对象放到这个类中。
3、视图给控制器传递数据
(1)Request.Form
(2)FormCollection
(3)Request
4、过滤器Filters:被用于整个应用程序而不适合放置于某个局部位置。
Filters功能:
(1)判断登录与否或用户权限
(2)决策输出缓存
(3)防盗链
(4)防蜘蛛
(5)本地化与国际化设置
(6)实现动态action
Filter要继承于ActionFilterAttribute抽象类
定义:
public class TestFilter:ActionFilterAttribute
{
public override void OnActionExecuting(ActionExectingContext filterContext)
{
filterContext.HttpContext.Session["temp"]="1";
}
}
使用:
[TestFilter]
public ActionResult FilterAction()
{
//代码
}
5、多个按钮提交表单实现
(1)<input type="submit" value="审核" onclick="this.form.action=\"<%=Url.Action(\"Action1\")%>\";"/>
点击按钮改变form的action属性
(2)在Action中判断通过哪个按钮提交
<input type="submit" value="审核" name="action"/>
public ActionResult Index(string action)
{
if(action=="审核")
{
}
else
{
}
}
(3)使用ActionSelector
public class MultiButtonAttribute:ActionNameSElectorAttribute
{
public string Name{get;set;}
public MultiButtonAttribute(string name)
{
this.Name=name;
}
public override bool IsValidName(ControllerContext c,string actionName,System.Reflection.MethodInfo methodInfo)
{
if(string.IsNullOrEmpty(this.Name))
{
return false;
}
else
{
return c.HttpContext.Request.Form.AllKeys.Contains(Name);
}
}
}
[MultiButton("action1")]
public ActionResult Action1()
{
return View();
}
[MultiButton("action2")]
public ActionResult Action2()
{
return View();
}
6、RenderBody、RenderPage、RenderSection
(1)RenderBody:在模板页中,@RenderBody()所占位置就是要填充的内容的位置。
(2)RenderPage:调用局部页面的加入。
(3)RenderSection:在母版页中占个位,让使用此母版的子页自己去呈现它们的Section。
HTML和CSS
1、高性能HTML代码
(1)CSS文件在前,JS文件在后,JavaScript代码放到页面底部。script标签两个属性async和defer。defer设为true则此文件滞后执行,不影响页面HTML渲染,async设为true则文件异步加载和执行。
2、CSS标准
(1)尽可能不用标签类型选择器;少用ID选择器。
(2)属性值为0后面单位可省略。url值两端引号可以省略。
Linq
from 指定查询操作的数据源和范围变量
select 指定查询结果的类型和表现形式
group 对查询结果进行分组
where 筛选元素的逻辑条件,一般由逻辑运算符组成
orderby对查询结果进行排序
join 连接多个查询操作的数据源
let 引入一个用于存储查询表达式中的子表达式结果的范围
into 提供一个临时的标识符。该标识可以引用join、group和select子句的结果
LINQ to Objects可以查询、检索、排序、聚合、分区、关联IEnumerable或IEnumerable<T>集合,也就是说可以操作任何可枚举的集合。
例1:定义一个字符串数组,查找数组中长度小于7的所有项。
string[] strName=new string[];
IEnumerable <string> selectQuery=
from Name in strName
where Name.Length<7
select Name;
例2:
from info in tb_Employee
select new
{
员工编号=info.ID,
员工姓名=info.Name,
性别=info.Sex
};
例3:
from info in tb_Employee
where info.ID="223"
select new
{
员工编号=info.ID,
员工姓名=info.Name,
性别=info.Sex
};
例4:
int[] values={1,2,3,4,5,6,7,8,9,0};
var value=from v in values
where v%2==0
select v;
foreach(var v in value)
{
Response.Write(v.ToString()+",");
}
例5:
ArrayList dynamicArr=new ArrayList();
dynamicArr.Add("ooo");
dynamicArr.Add("pppp");
dynamicArr.Add("qqqqq");
var query=from item in dynamicArr.ToArray()
where item.ToString().Length>3
select item;
foreach(var item in query)
{
Response.Write(item+",");
}
例6:
Dictionary<int,UserInfo> users=new Dictionary<int,UserInfo>();
users.Add(3,new UserInfo(1,"User01","01"));
users.Add(2,new UserInfo(2,"User02","02"));
users.Add(1,new UserInfo(3,"User03","03"));
var query=from item in users
orderby item.Key
select item;
foreach(var item in query)
{
Response.Write(string.Format("({0},{1})", item.Key,item.Value.UserName));
Response.Write("<br/>");
}
C#编码规范
1、数据类型简写规则
整型 int 长整形 lint
字符串 str 单精度浮点型 flt
布尔型 bl 双精度浮点型 dbl
短整形 sint 字节型 bt
2、变量及对象名称命名规则
模块级变量 M_数据类型简写_变量名
全局变量 G_变量名
局部变量 P_变量名
模块级常量 Mc_常量名
全局常量 Gc_常量名
过程级常量 Pc_常量名
C++
1、C中的存储区
栈:编译器自动分配释放(函数体中定义的变量)。
存储在栈中的对象,如:Human Jack;会在超出作用域时自动释放。
堆:程序员分配释放,程序结束可能由OS回收。使用new、malloc、calloc、realloc获取的存储区。
存储在堆中的对象,如Human *Jack=new Human;不会自动释放。
静态区、全局区:程序结束释放。加static修饰。如:静态局部变量属于静态存储方式,静态局部变量始终存在着,生存期是整个源程序,但是作用域只在函数内部,退出函数变量仍存在,但不能使用;允许对构造类静态局部变量赋初值,若未赋初值,则由系统自动赋值。
常量:程序结束释放。
2、内存泄露
(1)假如没有删除一个指针就对其重新赋值。
int *p=new int;
p=new int;
应该写成:
int *p=new int;
delete p;
p=new int;
3、指针和引用
(1)常量指针:int *const p;这个指针它自身的值是不可改变的,但它指向的目标是可以改变的。
(2)指向常量的指针:const int *p;指针可改变,指向的目标不可改变。
(3)指向常量的常指针:const int *const p;本身和指向的目标都不可改变。
(4)指针可以为空,引用不能为空。指针可以被赋值,引用只能初始化,不可以被赋为另一个对象的别名。堆中创建区域,必须用指针指向它,也可用引用来引用指向内存空间的指针。
4、成员变量初始化
class Rectangle
{
public:
Rectangle():length(3),width(5)
{
}
}
5、运算符重载
class num
{
public:
void operator++()
{
n++;
}
private:
int n;
}
6、向基类构造函数传递参数
class Father
{
public:
Father()
{
}
Father(string a,int i)
{
name=a;
tall=i;
}
~Father()
{
}
protected:
string name;
int tall;
};
class Son:public Father
{
public:
Son(string a,int i,int j):Father(a,i)
{
weight=j;
}
protected:
int weight;
}
7、多重继承产生两义性
一个派生类从多个基类派生,而这些基类又有一个共同的基类,那么派生类访问共同的基类中的成员时会产生两义性。
class A
{
public:
void hello()
{
}
};
class B
{
public:
void hello()
{
}
};
class C:public A,public B
{
C c;
c.A::hello();
c.B::hello();
}
8、虚函数 virtual
class Father
{
public:
virtual void run() const
{
}
};
class Son:public Father
{
public:
void run() const
{
}
};
int main()
{
Father *p=new Son;
p->run();
delete p;
return 0;
}
run()前加virtual表示该函数有多种形态的,即该函数可能被多个对象所拥有,而且功能不一,系统对于virtual的函数会自动判断是哪个对象调用了它,然后调用相应的函数。
9、纯虚函数:一个虚函数初始化为0就变成了纯虚函数。纯虚函数无任何功能,不能直接调用,它是抽象的,只有被子类继承了并赋予新功能才能使用。
virtual void run()=0;
包含纯虚函数的类叫抽象类。
不可以定义抽象类的对象,但可以定义一个指向抽象类的指针,该指针可以在编译时动态指向子类的对象,从而实现程序多态性。
10、C++与资源相关的对象,析构的时候都会把和它相关联的销毁。
MFC
1、MFC消息分类
(1)标准消息:除WM_COMMAND之外,所有以WM_开头的消息;从CWnd类派生的类都可以接收这类消息。
(2)命令消息:来自菜单、加速键或工具栏按钮的消息。这类消息都是以WM_COMMAND呈现,在MFC中以ID区分不同命令的消息,在SDK中以wParam参数识别。从CCmdTarget派生的类,接收这类消息。
(3)通告消息:由控件产生的消息。从CCmdTarget派生的类都可以接收这类消息。
2、m_bAutoMenuEnabled=false;
如果m_bAutoMenuEnabled为true,则会依次检查View、Document、Frame的消息映射表是否有这个弹出菜单中每个菜单项的处理函数,如果没有就会把那一项改为灰色的。
3、逗号表达式
if(GetDlgItem(IDC_NUMBER1)->GetWindowText(str),str=="Number1:")
{
}
4、控件访问方式
(1)GetDlgItem()->Get(Set)WindowText()
(2)Get(Set)DlgItemText()
(3)Get(Set)DlgItemInt()
(4)将控件和变量关联
(5)将控件和控件变量关联
(6)SendMessage()
(7)SendDlgItemMessage()