代码走查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搜索的结果,默认情况下点击进入是在本标签页打开的,这样就很麻烦, 可以在搜索结果的页面中进行设置,让它在新的标签页显示 搜索结果设置->搜索设置->新的标签页打开
随机推荐
- OpenGL ES 3.0之Shading Language(八)
每个OpenGL ES 3.0程序要求一个顶点着色器和一个片段着色器去渲染一个图形.着色器概念是API 的中心,本篇将介绍着色器语言部分包含下面几项 1.变量和变量类型 2.矢量和矩阵创建及选择 3. ...
- 解决Android sdk无法下载的问题
由于android官网在国内无法正常访问,在安装android sdk时经常会出现http://dl.google.com拒绝访问的情况.为了解决这个问题,建议使用国内镜像源,这里推荐几个: 1.mi ...
- MATLAB中的集合运算
matlab里关于集合运算和二进制数的运算的函数 intersect:集合交集ismember :是否集合中元素setdiff :集合差集setxor :集合异或(不在交集中的元素)union :两个 ...
- css调整图片位置布局
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE wml PUBLIC "-//WAP ...
- Spring boot 各种入门及问题
Spring boot 入门 整合(完整版): https://blog.csdn.net/winter_chen001/article/details/77249029 mybatis-genera ...
- TFS 之 彻底删除团队项目
方式一 通过选择“齿轮图标”打开团队项目集合的管理上下文. 打开要删除的团队项目的 上下文菜单. 如果未看到上下文图标 (),则你不是在访问 Visual Studio Online,或不是项目集合管 ...
- 【linux】Ubuntu中shell脚本无法使用source的原因及解决方法
问题现象: shell脚本中source aaa.sh时提示 source: not found 原因: ls -l `which sh` 提示/bin/sh -> dash 这说明是用dash ...
- uni - 使用npm
一.使用 1. 在当前根目录初始化package.json npm init -y 2. 安装(自动生成node_modules文件夹) npm i packageName yarn add pack ...
- [转] Compile、Make和Build的区别
针对Java的开发工具,一般都有Compile.Make和Build三个菜单项,完成的功能的都差不多,但是又有区别. 编译,是将源代码转换为可执行代码的过程.编译需要指定源文件和编译输出的文件路径 ...
- JavaScript中如何检测一个变量是一个String类型?请写出函数实现
方法1. function isString(obj){ return typeof(obj) === "string"? true: false; // returntypeof ...