代码走查25条疑问 C# 跳转新的标签页 C#线程处理 .Net 特性 attribute 学习 ----自定义特性 看懂 ,学会 .NET 事件的正确姿势-简单版
代码走查25条疑问
代码走查(Code Review) 是一个开发人员与架构师集中讨论代码的过程。通过代码走查可以提高代码的
质量,同时减少Bug出现的几率。但是在小公司中并没有代码走查的过程在这里总结和记录一些代码走
查的要求,时刻提醒自己注重代码质量,每天下班前自己走查一下自己的代码。代码走查一些注意事项
如下:
- 代码的注释与代码是否一致?注释是否是多余的?
- 是否存在超过3层嵌套的循环与/或判断?
- 变量的命名是否代表了其作用?
- 所有的循环边界是否正确?
- 所有的判断条件边界是否正确?
- 输入参数的异常是否处理了?
- 程序中所有的异常是否处理了?
- 是否存在重复的代码?
- 是否存在超过25行的方法?
- 是否存在超过7个方法的类?
- 方法的参数是否超过3个?
- 是否有多种原因导致修改某个类?
- 当发生某个功能变化时,是否需要修改多个类?
- 代码中的常量是否合适?
- 一个方法是否访问了其他类的多个属性?
- 某几项数据是否总是同时出现,而又不是一个类的属性?
- switch语句是否可以用类来替代?
- 是否有一类的职责很少?
是否有一个类的某些属性或者方法没有被其他类所使用?
在类的方法中是否存在如下的调用形式:a.b().c()?
是否某个类的方法总是调用另外一个类的同名方法?
是否某个类总是访问另外一个类的属性与方法?
是否两个类完成了类似的工作,使用了不同的方法名,却没有拥有同一个父类?
是否某个类仅有字段和简单的赋值方法与取值方法构成?
是否某个子类仅使用了父类的部分属性或方法?
这25条疑问就是代码规范的修炼手册,这25条疑问是别人总结出来的,记录在此用于提醒自己,
原文出处:https://blog.csdn.net/zzh920625/article/details/51475191
C# 跳转新的标签页
///这个是拿别人的,找到好多这个方法,溜了,不知道谁是原创
protected void btnPrint_Click(object sender, EventArgs e)
{
string url = "QR_CodePrintView.aspx?Code=" + tbAssetCode.Text + ";";
Redirect(Response, url, "_blank", "'toolbar=0,scrollbars=1,status=0,menubar=0,resizable=1,top=0,left=0,height=800,width=1000");
}
/// <summary>
/// 打开新的标签页
/// </summary>
/// <param name="response"></param>
/// <param name="url"></param>
/// <param name="target"></param>
/// <param name="windowFeatures"></param>
private void Redirect(HttpResponse response, string url, string target, string windowFeatures)
{
if ((String.IsNullOrEmpty(target) || target.Equals("_self", StringComparison.OrdinalIgnoreCase)) && String.IsNullOrEmpty(windowFeatures))
{
response.Redirect(url);
}
else
{
Page page = (Page)HttpContext.Current.Handler;
if (page == null)
{
throw new
InvalidOperationException("Cannot redirect to new window .");
}
url = page.ResolveClientUrl(url);
string script;
if (!String.IsNullOrEmpty(windowFeatures))
{
script = @"window.open(""{0}"", ""{1}"", ""{2}"");";
}
else
{
script = @"window.open(""{0}"", ""{1}"");";
}
script = String.Format(script, url, target, windowFeatures);
ScriptManager.RegisterStartupScript(page, typeof(Page), "Redirect", script, true);
}
}
C#线程处理
C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行。一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建的,并具有多线程创建额外的线程。
除非被指定,否则所有的例子都假定以下命名空间被引用了:
using System;
using System.Threading;
C#开启线程的方法有:
- 异步委托
- 通过Thread类
- 线程池
- 任务
总的来说其实线程的开启基本都涉及到委托的使用。
一、异步委托开启线程
首先来看一个比较简单的例子,采用第一种开启线程的方法——异步委托
using System;
using System.Threading;
namespace Study
{
class Program
{
static void test()
{
Console.WriteLine("TestThread");
}
static void Main(string[] args)
{
Action a = test;
a.BeginInvoke(null, null);
Console.WriteLine("MainThread");
Console.ReadLine();
}
}
}
编译运行,发现结果与预期有所不同。结果如下图
如果按着逐行运行代码的方式,那么应该是先输出TestThread,但是结果却是先输出MainThread。
将a.BeginInvoke(null,null);
和Console.WriteLine("MainThread");
对调位置之后,结果和之前的依然一致。这就说明,异步委托开启的线程是和主线程同时同步进行的。
Action委托是指向一个没有返回值的函数,那么假设一个线程,我们需要取得他的返回结果并输出,那么就要用到Func委托。
看下面的源码
using System;
using System.Threading;
namespace SummerStudy
{
class Program
{
static string test(int i, string str)
{
Console.WriteLine("TestThread" + "\t参数i是:" + i);
return str;
}
static void Main(string[] args)
{
Func<int, string, string> a = test;
IAsyncResult res = a.BeginInvoke(1, "返回值", null, null);
string o = a.EndInvoke(res);
Console.WriteLine("MainThread\t" + "线程返回值是:" + o);
Console.ReadLine();
}
}
同时异步委托开启线程中,判断线程是否结束的方法也有两种,一种是利用IAsyncResult的IsCompleted方法,一种是使用方法进行线程结束判断。
具体使用方法如下。
- IsCompleted(bool)
IAsyncResult ia = a.BeginInvoke()
if(ia.IsCompleted == false)
{
//GoOn
}
- AsyncWaitHandle
IAsyncResult ia = a.BeginInvoke()
ia.AsyncWaitHandle.WaitOne(Time);//Time为等待时间,超时后才会运行下一行代码,未完成直接跳出返回false
或者通过自定义方法,BeginInvoke中倒数第二个参数是一个委托,传递一个函数,在线程结束之后会自动的调用。
static string Test(int a)
{
}
Func<int, string> a = Test;
IAsyncResult ia = a.BeginInvoke(100, CallBack, a);
static void CallBack(IAsyncResult ar)
{
Func<int, string> a = ia.AsyncState as Func<int, string>;
string res = a.EndInvoke(ar);
}
在使用Lambda表达式作为委托的时候,最后一个参数可以为空,因为Lambda表达式可以访问外部变量。
二、使用Thread类开启线程
使用Thread类创建一个实例,它的构造方法中需要传递一个委托。通过委托绑定线程。
直接上代码
using System;
using System.Threading;
namespace Study
{
class Program
{
static void test()
{
Console.WriteLine("Thread");
Thread.Sleep(2000);
Console.WriteLine("TimeOver");
}
static void Main(string[] args)
{
Thread t = new Thread(test);
t.Start();
Console.WriteLine("Main");
Console.Read();
}
}
}
对于需要传递参数的委托,则必须制定参数类型为object,在线程Start方法中传递参数
namespace SummerStudy
{
class Program
{
static void test(object c)
{
int id = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine("Thread,\t线程id为" + id + ",\t参数是:" + c);
Thread.Sleep(2000);
Console.WriteLine("TimeOver");
}
static void Main(string[] args)
{
Thread t = new Thread(test);
t.Start("xxx.avi");
Console.WriteLine("Main");
Console.Read();
}
}
}
当然你也可以自定义一个类,在类中自定义数据传递。
三、线程池
这种方法有助于节省时间,具体使用方法如下
using System;
using System.Threading;
namespace SummerStudy
{
class Program
{
static void test(object c)
{
int id = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine("Thread,\t线程id为" + id + ",\t参数是:" + c);
Thread.Sleep(2000);
Console.WriteLine("TimeOver");
}
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(test, "asfasf");
Console.Read();
}
}
}
其中委托必须要有一个参数,无论是否使用该参数。且只适用于使用时间短的线程,不能改变优先级
四、任务
使用Task类开启线程,还有TaskFactory创建
Task类实例
using System;
using System.Threading;
using System.Threading.Tasks;
namespace SummerStudy
{
class Program
{
static void test(object c)
{
int id = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine("Thread,\t线程id为" + id);
Thread.Sleep(2000);
Console.WriteLine("TimeOver");
}
static void Main(string[] args)
{
Task t = new Task(test, "Asfgasg");
t.Start();
//或者
TaskFactory tf = new TaskFactory();
Task t1 = tf.StartNew(test);
Console.Read();
}
}
}
.Net 特性 attribute 学习 ----自定义特性
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
[Obsolete("不要用无参构造函数",true)] //这个特性,是不能使用无参构造函数
public Student()
{ }
public Student(int id, string name,int age)
{
this.Id = id;
this.Name = name;
this.Age = age;
}
public void Show()
{
Console.WriteLine("这个show方法");
}
}
if (prop.IsDefined(typeof(ControlAgeAttribute ),true))//判断当前属性是否有ControlAgeAttribute 的特性
{
Student student = new Student(12,"hahaha",15);
Console.WriteLine(student.CompareAgeManage()); //15在12和20 之间,所以是True;
}
看懂 ,学会 .NET 事件的正确姿势-简单版
发现之前写了一篇关于事件的阐述写的过于抽象。现在想想先理解本质由简入难比较合适
之前的一篇博客地址:https://www.cnblogs.com/LiMin/p/7212217.html
参照网上例子给个简单版本的如下:猫叫->老鼠跑了->主人醒了

using System; namespace EventTest { public class EventDemo { public void EventTest() { Cat cat = new Cat(); Mouse ms = new Mouse(); Master mas = new Master(); cat.Calling += ms.Escape;//老鼠对 clling 订阅 cat.Calling += mas.Wakened;//人 对 calling 订阅 cat.Call(); //猫叫 } } public sealed class Cat { public event EventHandler Calling; public void Call() { Console.WriteLine("猫叫了..."); Calling?.Invoke(this, EventArgs.Empty); } } public sealed class Mouse : EventArgs { public void Escape(object sender, EventArgs e) { Console.WriteLine("老鼠逃跑了..."); } } public sealed class Master { public void Wakened(object sender, EventArgs e) { Console.WriteLine("主人醒了"); } } }

代码走查25条疑问 C# 跳转新的标签页 C#线程处理 .Net 特性 attribute 学习 ----自定义特性 看懂 ,学会 .NET 事件的正确姿势-简单版的更多相关文章
- C# 跳转新的标签页
///这个是拿别人的,找到好多这个方法,溜了,不知道谁是原创 protected void btnPrint_Click(object sender, EventArgs e) { ...
- Google 浏览器设置打开超链接到新窗口标签页
一.windows 按住Ctrl + 鼠标点击,在新窗口打开,停留在当前页面: 按住Ctrl + Shift + 鼠标点击,在新窗口打开,停留在新窗口: 登录Google账号,管理Google账号, ...
- Google浏览器设置搜索打开新的标签页
每次用google搜索的时候,点击进去原来的搜索页面就不见了 ,其实可以设置打开新的标签页 1.登陆Chrome 2.登陆这个网址https://www.google.com/preferences ...
- chrome打开收藏夹的网站在新的标签页
chrome浏览器在新的标签页打开收藏夹的网址,现在设置不了,而且右键,在新标签页中打开有点烦..下面说说直接打开的方式. 方法1: 鼠标滚轮,直接点击收藏夹的网址,即可 方法2: ctrl + 鼠标 ...
- window.open新打开窗口与新开标签页
最近在使用window.open时忽略了一个细节问题:window.open新打开一个窗口,但是有时却是新打开一个窗口有时打开一个新标签页.虽然对一般的需求来说,这个两种情况都无所谓,但是对于那种有强 ...
- selenium获取新页面标签页(只弹出一个新页面的切换)
selenium获取新页面标签页(只弹出一个新页面的切换) windows = driver.current_window_handle #定位当前页面句柄 all_handles = driver. ...
- 随笔教程:FastAdmin 如何打开新的标签页
随笔教程:FastAdmin 如何打开新的标签页 FastAdmin 有弹窗功能有时候不能胜任所有情况,有一定局限性. 那这时候就需要在新的标签页打开页面. 在 FastAdmin 中打新的标签页很简 ...
- webdriver高级应用- 浏览器中新开标签页(Tab)
#encoding=utf-8 import unittest from selenium import webdriver import time import win32api, win32con ...
- 设置Google搜索在新的标签页打开
Google搜索的结果,默认情况下点击进入是在本标签页打开的,这样就很麻烦, 可以在搜索结果的页面中进行设置,让它在新的标签页显示 搜索结果设置->搜索设置->新的标签页打开
随机推荐
- C#.NET常见问题(FAQ)-命名空间namespace如何理解
Namespace就是定义一个对象是哪个门派的,比如你现在就在A门派下,A门派的所有功夫(属性和方法)都可以不加声明直接调用.如果你要用B门派的功夫,就要先声明是B门派的XXX对象的XXX实例的XXX ...
- jQuery的md5加密插件及其它js md5加密代码
/** * jQuery MD5 hash algorithm function * * <code> * Calculate the md5 hash of a String * Str ...
- ZH奶酪:Python中zip函数的使用方法
定义:zip([iterable, …]) zip()是Python的一个内建函数,它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些 tuples组成 ...
- js 开源k线图开发库
https://github.com/andredumas/techan.js/wiki http://techanjs.org/ A visual, stock charting (Candlest ...
- WEB打印控件Lodop使用体会
控件的使用方法,作者都已经有详细的使用说明供使用者参考. 但是对于打印表格,确实出现一点小问题,如果表格是自然高度,也就是只设置了table的高度,此时是可以正常显示的 ...
- 跟踪 Ring3 - Ring0 的运行流程
理论知识 SYSENTER 指令是在 Inter Pentium(R) Ⅱ 处理器上作为"高速系统调用"功能的一部分被首次引用的. SYSENTER 指令进行过专门的优化,能够以最 ...
- MySQL源代码解读
第一步: 下载bison-2.4.1-setup.exe链接地址 第二步: 下载cmake-2.8.6-win32-x86.exe链接地址 第三步: 下载MySQL链接地址 G:\Mlearn\mys ...
- java 截取字符串
java 截取字符串 CreationTime--2018年7月17日16点37分 Author:Marydon 1.去除最后一个字符 方式一:String 方式二:StringBuilder.S ...
- java byte数组与String互转
java byte数组与String互转 CreationTime--2018年7月6日14点53分 Author:Marydon 1.String-->byte[] 方法:使用String ...
- ps 如何制作动态打字图?
1.情景展示 有几句话,想以打字的形式出现,而不是干巴巴的几个字,如何实现这个有趣的效果呢? 2.解决方案 第一步:录制屏幕:将想展示的文字逐字打出来-->保存: 第二步:将录制的视频使用p ...