1、vs中F5(调试)和Ctrl + F5(直接运行不调试)的区别:
Ctrl+F5是直接运行生成的程序,不进行重新编绎,所以运行起来比较快
F5是重新编绎后再运行,这样可以在程序代码中设置断点跟踪来调试程序
f5会重新生成项目,而ctrl+f5不会重新生成。
配置文件:F5调试需设置debug=true 启用调试 ,上线后要改成false
<system.web>
<compilation debug="false" targetFramework="4.0"/>
</system.web>
2、vs会给我们的项目(不管是控制台还是web)自动生成两个文件夹bin和obj:
bin里是程序编译最终生成的东西(一般为程序集或.exe文件),当我们运行程序时,其实运行的就是这里面的东西。而不是每次运行都会再去编译了,除非我们手动主动去编译,程序在vs解决方案中用编译器每重新生成一次,这里面的所有文件都会被更新(假如生成失败,文件夹里什么都没有)。这里除了用本项目的dll或程序集,也会包括引用到的第三方程序集。
obj里面是生成编译过程中产生的一系列中间文件,可以不用管它;
3、C#自带的两个常用泛型委托:
Func<T> 必须要有返回值的,所以至少有一个泛型类型参数(输出类型),当有参数时,输出参数类型为最后一个
Action 委托类型:是没有返回值的,可以有任意个参数。
4、自定义控件(.ascx):
在待使用的页面使用之前先注册,如 <%@ Register Src="header.ascx" TagName="header" TagPrefix="uc1" %> 值分别对应 自定义控件url 标签前缀
使用时: <uc2:footer ID="Footer1" runat="server" /> // 标签前缀 :标签名称
5 .asp.net <%%>&<%#%>&<%=%>&<%@%>&<%$%>用法区别:
1).<% %>用来绑定后台代码
如:
< %
for(int i=0;i<100;i++)
{
Reaponse.Write(i.ToString());
}
%>
2).<%# %> 是在绑定控件DataBind()方法执行时被执行,用于数据绑定
<table>
<tr>
<td>ID</td>
<td>姓名</td>
<td>性别</td>
<td>年龄</td>
</tr>
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<tr>
<td><%# Eval("ID") %></td>
<td><%# DataBinder.Eval(Container.DataItem,"Age")%></td>
<td><%# DataBinder.Eval(Container,"DataItem.Name")%></td>
<td><%# ((DataRowView)Container.DataItem)["Sex"]%></td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
3).<%= %>用来绑定后台的变量或方法且有返回值 的,但此时的变量名或方法的访问修饰符为protected或public
如:<%=name%> <%=getstr()%>
4).<%@ %>用来导入后台命名空间
如:<%@ import namespace="system.data">
5).<%$ %>用来绑定web.config里的字符串(键值对)
如:<asp:TextBox runat="server" ID="cc" Text="<%$ ConnectionStrings:pubs%>"></asp:TextBox>
web.config
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<connectionStrings>
<add name="pubs" connectionString="Server=.;database=pubs;uid=sa;pwd=" providerName="System.Data.SqlClient"/>
</connectionStrings>
</configuration>
6).DataBind,获得的数据,系统会将其默认为String,怎样转化为其它的类型?
DataBinder.eval_r(Container.DataItem,"转换的类型","格式") 注:格式可以不要 此方法=eval_r("转换的类型")
6、ASP.NET 中的Eval()方法 :见 ,http://fhuan123.iteye.com/blog/824490
7、?? 运算符称作 null 合并运算符。如果此运算符的左操作数不为 null,则此运算符将返回左操作数;否则返回右操作数。
8、对一个集合排序 如 List<Person>
public class Person
{
public int id { get; set; }
public string name { get; set; }
public int age { get; set; }
}
方法一:直接对对象进行排序
ps.Sort( (P x,P y) => x.age - y.age ); //直接对ps对象排序 无返回值,此时是升序 颠倒x y顺序即为降序
方法二、返回排序后的结果:
ps= ps.OrderByDescending(c => c.age).ToList();
ps.OrderBy(s => s.age).ToList();
所以想改变原集合对象,可使用方法一 不想改变原集合对象可使用方法二。
9、判断B集合中是否有A集合中的元素:
List<int> listA = new List<int> { 12,34,456,67,98 };
List<int> listB = new List<int> { 74,84,63 };
listB.Exists(listA.Contains); //true 存在 false不存在
List<T>.Exists()方法
public bool Exists(
Predicate<T> match
)
参数是一个泛型委托对象 :public delegate bool Predicate<in T>(T obj);
如果 List<T> 包含的一個或多個元素符合指定之述詞所定義的條件,則為 true,否則為 false。
List<T>.Find()和FindAll也接受同样的参数。
其实这几个方法会把调用者集合对象里的每个元素当做参数运行下这个参数(委托),根据其返回值,来最终决定函数的返回值。
10、集合分组: IEnumerable<T>.GroupBy()
分组方法返回的数据类型: public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector); 是一个可枚举的集合
集合中的每个元素也是一个可枚举对象: public interface IGrouping<out TKey, out TElement> : IEnumerable<TElement>, IEnumerable 该对象有个属性 Key 返回分组的键。
11、项目(类库 web程序等)直接的引用:
那个类库是基于4.5框架的 这个是4.0的 低版本不能引用高版本的 反之可以
右键项目=》属性=》目标框架
12、项目之间的相互应用:
有个A项目(假设是Web项目)两个类库项目B、C
如果B需要引用C (B的bin文件夹中最终肯定会有C.dll)
A在引用B的同时必须把C引用进去 (即在A项目的Bin中有C的.dll):
备注:如果把C.程序集和B程序集放在一起 只要手动引用B就行了 vs检测到和B中引用到的其它程序集都会一同引用进来的(如果不在同一个目录下 则需要单独引用下)
备注:如果A本身就需要引用到C 而不是通过B 则还是需要单独引用C.
13、default(T):
返回T类型的默认值:T值类型 返回0 引用类型null 结构类型:返回结构类型 每个成员是其默认值。
14.断言
任何地方调用 阻断当前线程 弹出弹框
System.Diagnostics.Debug.Fail("123");
15、时间格式化:MM表示月份 mm表示分钟数 HH和hh分别表示24小时和12小时制,时数。
DateTime dt = DateTime.Now;
Console.WriteLine(dt.ToString()); //2015/12/11 23:23:59
Console.WriteLine(dt.ToString("yyyy-MM-dd HH:mm:ss")); //2015-12-11 23:23:59
Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss")); //2015-12-11 11:23:59