热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

厚积薄发,丰富的公用类库积累,助你高效进行系统开发(11)各种线程相关操作类...

俗话说,一个好汉十个帮,众人拾柴火焰高等都说明一个道理,有更多的资源,更丰富的积累,都是助你走向成功ÿ

俗话说,一个好汉十个帮,众人拾柴火焰高等都说明一个道理,有更多的资源,更丰富的积累,都是助你走向成功,走向顶峰的推动力。

本篇的公用类库的介绍主题是程序开发中多线程操作环境中,常用到的线程相关类,本篇随笔介绍包含单件创建辅助类、Timer定时器、委托处理辅助类、队列的线程处理服务辅助类、可以取消执行操作的线程池辅助类、线程池辅助类、线程辅助类等对象,这些辅助类覆盖了多线程开发中绝大多数的应用。良好的封装及操作,给我们提供非常方便、高效的线程操作处理。

本篇继续继续整理优化已有的共用类库,并继续发表随笔介绍公用类库的接口方法以及详细使用操作,力求给自己继续优化,积攒更丰富的公用类库资源,加深了解的同时,也给大家展现公用类库好的方面。

厚积薄发,丰富的公用类库积累,助你高效进行系统开发(10)---各种线程同步的集合类
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(9)----各种常用辅助类
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(8)----非对称加密、BASE64加密、MD5等常用加密处理
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(7)-----声音播放、硬件信息、键盘模拟及钩子、鼠标模拟及钩子等设备相关 
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(6)----全屏截图、图标获取、图片打印、页面预览截屏、图片复杂操作等
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(5)----热键、多线程、窗体动画冻结等窗体操作
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(4)----CSV、Excel、INI文件、独立存储等文件相关
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(3)----数据库相关操作
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(2)----常用操作
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(1)----开篇总结

1、单件操作辅助类 Singleton。  

实现效果

1) 本辅助类主要是用来方便实现类对象的单件实例操作,减少重复写单件实现代码的繁琐,简化类的代码。 

2)创建一个类对象的单件实例,类对象的构造函数不能为Public修饰符的,一般为private。

 

实现代码

1)辅助类提供的方法源码如下所示: 

///


/// 创建一个类对象的单件实例,类对象的构造函数不能为Public修饰符的,一般为private。
///

/// 待创建的对象类
public static class Singleton where T : class
{
static volatile T _instance;
static object _lock = new object();

static Singleton()
{
}

///
/// 创建/获取一个可以new的类对象的单件实例
///

public static T Instance
{
get
{
if (_instance == null)
lock (_lock)
{
if (_instance == null)
{
ConstructorInfo constructor = null;

try
{
// 构造函数不包含public修饰符的
constructor = typeof(T).GetConstructor(BindingFlags.Instance |
BindingFlags.NonPublic, null, new Type[0], null);
}
catch (Exception exception)
{
throw new InvalidOperationException(exception.Message, exception);
}

if (constructor == null || constructor.IsAssembly)
{
throw new InvalidOperationException(string.Format("在'{0}'里面没有找到private或者protected的构造函数。", typeof(T).Name));
}

_instance = (T)constructor.Invoke(null);
}
}

return _instance;
}
}

2)辅助类Singleton的使用例子代码如下所示

///


/// 单件测试类
///

public class TestSingletonClass
{
///
/// 私有构造函数
///

private TestSingletonClass()
{
}

public void ShowMessage()
{
MessageUtil.ShowTips("单件实例测试函数");
}
}

private void btnSingleton_Click(object sender, EventArgs e)
{
//单件辅助类使用代码
Singleton.Instance.ShowMessage();
}


如果没有使用单件辅助类,那么单件的测试类将会需要这样书写,很明显多了很多行代码,如果每个想单件处理的类都要这样写,代码量还是很可观的,而且比较繁琐。

///


/// 单件测试类
///

public class TestSingletonClass
{
private static TestSingletonClass m_Instance;

///
/// 单件实例
///

public static TestSingletonClass Instance
{
get
{
if (m_Instance == null)
{
m_Instance = new TestSingletonClass();
}
return m_Instance;
}
}

///
/// 私有构造函数
///

private TestSingletonClass()
{
}

public void ShowMessage()
{
MessageUtil.ShowTips("单件实例测试函数");
}
}

 

2、定期执行某些任务的定时器辅助类Timer。  

实现效果

1)  本辅助类主要是用来方便实现定时器辅助类,功能和另外一个定时器辅助类TimerHelper差不多。

2) 定时器操作,都通过对象锁以及在运行处理事件的时候,动态改变间隔事件为无限等待,处理完成后修改为间隔时间的方式,实现对定时器的正常、安全执行,不会发生运行一半又跳到下一个的处理过程中。 

3).NET提供了3种定时器实现,他们的特点如下所示。该Timer辅助类是基于Threading.Timer的定时器实现。

Server TimersSystem.Timers.Timer基于服务器的计时器,位于"工具箱"的“组件”选项卡上
Thread TimersSystem.Threading.Timer在编程时使用的线程计时器
Windows TimersSystem.Windows.Forms.Timer基于 Windows 的标准计时器,"工具箱"的"Windows 窗体"选项卡上;

实现代码

1)辅助类提供的方法接口如下所示: 

#region 事件或属性

///


/// 按定时器周期定期引发的事件
///

public event EventHandler Elapsed;

///
/// 定时器任务间隔(毫秒)
///

public int Period { get; set; }

///
/// 指示是否在方法开始的时候,启动定时器Elapsed事件一次。默认为false。
///

public bool RunOnStart { get; set; }

#endregion

#region 构造函数

///
/// 创建一个定时器
///

/// 定时器间隔 (毫秒)
public Timer(int period) : this(period, false)

///
/// 创建一个定时器
///

/// 定时器间隔 (毫秒)
/// 指示是否在方法开始的时候,启动定时器Elapsed事件一次
public Timer(int period, bool runOnStart)

#endregion

#region 方法

///
/// 启动定时器
///

public void Start()

///
/// 停止定时器
///

public void Stop()

///
/// 等待定时器停止
///

public void WaitToStop()


#endregion

2)辅助类Timer 的使用例子代码如下所示

private void btnTimer_Click(object sender, EventArgs e)
{
WHC.OrderWater.Commons.Threading.Timer timer = new WHC.OrderWater.Commons.Threading.Timer(1000, true);
timer.Elapsed += new EventHandler(timer_Elapsed);
timer.Start();
}

void timer_Elapsed(object sender, EventArgs e)
{
if (!this.InvokeRequired)
return;

this.Invoke(new MethodInvoker(delegate()
{
this.btnTimer.Text = DateTime.Now.ToLongTimeString();
}));
}

 

3、定时器辅助类TimerHelper,可指定运行间隔、延迟启动时间等操作。  

实现效果

1) 本辅助类主要是用来方便实现定时器辅助类,可指定运行间隔、延迟启动时间等操作。功能和另外一个定时器辅助类Timer差不多。 

2)定时器操作,都通过对象锁以及在运行处理事件的时候,动态改变间隔事件为无限等待,处理完成后修改为间隔时间的方式,实现对定时器的正常、安全执行,不会发生运行一半又跳到下一个的处理过程中。 

 

实现代码

1)辅助类提供的方法接口如下所示: 

 

///


/// 定时器执行操作的函数原型
///

public delegate void TimerExecution();

///
/// 定时器执行时调用的操作
///

public event TimerExecution Execute;

///
/// 创建一个指定时间间隔的定时器,并在指定的延迟后开始启动。(默认间隔为100毫秒)
///

public TimerHelper()

///
/// 创建一个指定时间间隔的定时器,并在指定的延迟后开始启动。
///

/// 定时器执行操作的间隔时间(毫秒)
/// 指定的延迟时间(毫秒)
public TimerHelper(long interval, int startDelay)

///
/// 创建一个指定时间间隔的定时器
///

/// 定时器执行操作的间隔时间(毫秒)
/// 是否启动
public TimerHelper(long interval, bool start)

///
/// 启动定时器并指定延迟时间(毫秒)
///

/// 指定延迟时间(毫秒)
public void Start(int delayBeforeStart)

///
/// 立即启动定时器
///

public void Start()

///
/// 暂停定时器
/// 注意:运行中的线程不会被停止
///

public void Pause()

///
/// 停止定时器
/// 注意:运行中的线程不会被停止
///

public void Stop()

///
/// 定时器的处理时间
///

///
public void Tick(object obj)

///
/// 定时器的状态
///

public TimerState State

///
/// 获取或设置定时器的运行间隔
///

public long Interval

2)辅助类TimerHelper的使用例子代码如下所示

public FrmNewHouse()
{
InitializeComponent();

if (!this.DesignMode)
{
this.winGridViewPager1.OnPageChanged += new EventHandler(winGridViewPager1_OnPageChanged);
this.winGridViewPager1.OnStartExport += new EventHandler(winGridViewPager1_OnStartExport);
this.winGridViewPager1.OnRefresh += new EventHandler(winGridViewPager1_OnRefresh);
this.winGridViewPager1.OnGridViewMouseDoubleClick += new EventHandler(winGridViewPager1_OnGridViewMouseDoubleClick);
this.winGridViewPager1.ShowLineNumber = true;
this.winGridViewPager1.PagerInfo.PageSize = 20;
this.winGridViewPager1.BestFitColumnWith = true;
this.winGridViewPager1.AppendedMenu = this.contextMenuStrip1;
this.winGridViewPager1.gridView1.RowCellStyle += new DevExpress.XtraGrid.Views.Grid.RowCellStyleEventHandler(gridView1_RowCellStyle);

//使用定时器,定时刷新窗体的数据,并提示客户更新情况
int interval = Portal.gc.GetRefreshSecond();//获取定时间隔时间
TimerHelper timer = new TimerHelper(interval, true);
timer.Execute += new TimerHelper.TimerExecution(timer_Execute);
}
}

//通过Invoke来实现跨线程间的调用
void timer_Execute()
{
if (!this.InvokeRequired)
return;

this.Invoke(new MethodInvoker(delegate()
{
NotifyNewHouse();
}));
}


4、提供一个队列的线程处理服务辅助类 QueueServer。   

实现效果

1)  本辅助类主要是用来方便实现提供一个队列的线程处理服务操作。QueueServer是一个先入先出(FIFO)的队列处理服务。

实现代码

1)辅助类提供的方法接口如下所示: 

#region 属性方法

///


/// 是否是背景线程
///

public bool IsBackground

///
/// 执行队列
///

public T[] Items

///
/// 队列数量
///

public int QueueCount

///
/// 将对象加到队列结尾
///

///
public void EnqueueItem(T item)

///
/// 清除队列
///

public void ClearItems()

#endregion

#region 线程处理

///
/// 处理单个元素
///

/// 元素项目
protected virtual void OnProcessItem(T item)

///
/// 处理函数
///

public event Action ProcessItem;

#endregion

2)辅助类QueueServer的使用例子代码如下所示

private void btnQueneServer_Click(object sender, EventArgs e)
{
QueueServer queueServer = new QueueServer();
queueServer.IsBackground = true;
queueServer.ProcessItem += new Action(queueServer_ProcessItem);

//循环入队
for (int i &#61; 0; i <100; i&#43;&#43;)
{
queueServer.EnqueueItem(new PreDataInfo(i.ToString(), DateTime.Now.ToString()));
Thread.Sleep(10);
}
}

///


/// 处理每个出队的操作
///

void queueServer_ProcessItem(PreDataInfo obj)
{
Console.WriteLine("{0} : {1}", obj.Key, obj.Data);
}
}

public class PreDataInfo
{
public string Key;
public string Data;

public PreDataInfo()
{
}

public PreDataInfo(string key, string data)
{
this.Key &#61; key;
this.Data &#61; data;
}
}


5、可以取消执行操作的线程池辅助类 AbortableThreadPool。  

实现效果

1) 本辅助类主要是用来方便实现可以取消执行操作的线程池操作。 

2&#xff09;AbortableThreadPool线程辅助类可以使用常用的多线程处理环境中&#xff0c;也可以使用在有些在运行过程中可能需要取消的线程处理环境中。

 

实现代码

1&#xff09;辅助类提供的方法接口如下所示&#xff1a; 

///


/// 把执行操作放到队列中。当线程池的线程可用的时候&#xff0c;方法执行。
///

/// 一个代表将要执行方法的WaitCallback对象
public static WorkItem QueueUserWorkItem(WaitCallback callback)

///
/// 把执行操作放到队列中&#xff0c;并指定了一个对象&#xff0c;它包含将要执行方法的数据。
/// 当线程池的线程可用的时候&#xff0c;方法执行。
///

/// 一个代表将要执行方法的WaitCallback对象
/// 一个对象&#xff0c;它包含将要执行方法的数据
public static WorkItem QueueUserWorkItem(WaitCallback callback, object state)

///
/// 取消指定的队列中的工作项。
///

/// 线程池中取消的项目
/// 如果设置为则允许终止线程
/// 项目队列的状态
public static WorkItemStatus Cancel(WorkItem item, bool allowAbort)

///
/// 获取指定队列中工作项的状态
///

/// 线程池中工作项
/// 工作项的状态
public static WorkItemStatus GetStatus(WorkItem item)

///
/// 取消所有任务
///

/// 线程是否终止
public static void CancelAll(bool allowAbort)

///
/// 类似Thread.Join,等待AbortableThreadPool执行完成
///

public static void Join()

///
/// 类似Thread.Join,等待AbortableThreadPool执行完成
///

/// 等待的毫秒数
///
public static bool Join(int millisecondsTimeout)

///
/// 类似Thread.Join,等待AbortableThreadPool执行完成
///

/// 等待的时间范围
///
public static bool Join(TimeSpan timeout)

///
/// 在队列中&#xff0c;还未执行处理的数量
///

public static int QueueCount

///
/// 在执行中的线程数量
///

public static int WorkingCount

2&#xff09;辅助类AbortableThreadPool的使用例子代码如下所示

private void btnAbortableThreadPool_Click(object sender, EventArgs e)
{
Console.WriteLine(string.Format("QueueCount:{0},WorkingCount:{1}", AbortableThreadPool.QueueCount, AbortableThreadPool.WorkingCount));

WorkItem workItem1 &#61; AbortableThreadPool.QueueUserWorkItem(new WaitCallback(Test));
Console.WriteLine(string.Format("QueueCount:{0},WorkingCount:{1}", AbortableThreadPool.QueueCount, AbortableThreadPool.WorkingCount));

WorkItem workItem2 &#61; AbortableThreadPool.QueueUserWorkItem(new WaitCallback(Test));
WorkItem workItem3 &#61; AbortableThreadPool.QueueUserWorkItem(new WaitCallback(Test));
WorkItem workItem4 &#61; AbortableThreadPool.QueueUserWorkItem(new WaitCallback(Test));
WorkItem workItem5 &#61; AbortableThreadPool.QueueUserWorkItem(new WaitCallback(Test));
Console.WriteLine(string.Format("QueueCount:{0},WorkingCount:{1}", AbortableThreadPool.QueueCount, AbortableThreadPool.WorkingCount));
Thread.Sleep(1000);

Console.WriteLine(AbortableThreadPool.Cancel(workItem1, false));
Console.WriteLine(string.Format("QueueCount:{0},WorkingCount:{1}", AbortableThreadPool.QueueCount, AbortableThreadPool.WorkingCount));
Thread.Sleep(1000);

Console.WriteLine(AbortableThreadPool.Cancel(workItem1, true));
Console.WriteLine(string.Format("QueueCount:{0},WorkingCount:{1}", AbortableThreadPool.QueueCount, AbortableThreadPool.WorkingCount));
Thread.Sleep(1000);

//AbortableThreadPool.CancelAll(true);//可取消所有任务
AbortableThreadPool.Join(); //等待所有任务退出
Console.WriteLine(string.Format("QueueCount:{0},WorkingCount:{1}", AbortableThreadPool.QueueCount, AbortableThreadPool.WorkingCount));
}

static void Test(object state)
{
int i &#61; 100;
while (i-- > 0)
{
Console.WriteLine(i);
Thread.Sleep(new Random((int)DateTime.Now.Ticks).Next(100));
}
}



6、委托处理辅助类DelegateHelper。  

实现效果

1) 本辅助类主要是用来方便实现委托的处理。 

2&#xff09;使用委托处理辅助类DelegateHelper&#xff0c;可以快速执行或者取消一些委托方法的执行。

 

实现代码

1&#xff09;辅助类提供的方法接口如下所示&#xff1a; 

 

///


/// 执行委托操作
///

/// 目标委托对象
/// 参数
public static WorkItem InvokeDelegate(Delegate target, params object[] args)

///
/// 执行委托操作
///

/// 目标委托对象
public static WorkItem InvokeDelegate(Delegate target)

///
/// 中止指定的队列中委托
///

/// 目标委托对象
/// 项目队列中止操作的状态
public static WorkItemStatus AbortDelegate(WorkItem target)

2&#xff09;辅助类DelegateHelper的使用例子代码如下所示

private void btnDelegeteHelper_Click(object sender, EventArgs e)
{
//无参数的委托
DelegateHelper.InvokeDelegate(new UpdateTextDelegate(this.UpdateText));

//有参数的委托
DelegateHelper.InvokeDelegate(new UpdateTextDelegate2(this.UpdateText), 100);

}
private delegate void UpdateTextDelegate();
private delegate void UpdateTextDelegate2(int count);
private void UpdateText()
{
for (int i &#61; 0; i <1000; i&#43;&#43;)
{
Thread.Sleep(100);
}
}
private void UpdateText(int count)
{
for (int i &#61; 0; i {
Thread.Sleep(100);
}
}


7、线程池辅助操作类 ThreadPoolHelper。  

实现效果

1) 本辅助类主要是用来方便实现线程池辅助操作。。 

实现代码

1&#xff09;辅助类提供的方法接口如下所示&#xff1a;

///


/// 方法委托
///

public delegate void WaitCallbackNew();

///
/// 把执行方法放到队列中。
/// 当线程池线程变为可用的时候&#xff0c;方法执行。
///

/// 委托对象
public static bool QueueUserWorkItem(WaitCallbackNew callback)

///
/// 把执行方法放到队列中。
/// 当线程池线程变为可用的时候&#xff0c;方法执行。
///

/// 委托对象数组
///
public static bool QueueUserWorkItems(params WaitCallbackNew[] proc)

///
///等待指定数组中所有元素收到信号
///

public static bool WaitAll()

///
///等待指定数组中任何一个元素收到信号
///

/// 满足等待的对象数组索引
public static int WaitAny()

2&#xff09;辅助类ThreadPoolHelper的使用例子代码如下所示

private void UpdateText()
{
for (int i &#61; 0; i <50; i&#43;&#43;)
{
Thread.Sleep(100);
}
}

private void btnThreadPool_Click(object sender, EventArgs e)
{
ThreadPoolHelper.QueueUserWorkItem(new ThreadPoolHelper.WaitCallbackNew(UpdateText));
ThreadPoolHelper.WaitAny(); //阻塞主界面线程&#xff0c;到5秒循环结束后&#xff0c;主界面可以操作
}


8、线程操作辅助类ThreadHelper。 

实现效果

1) 本辅助类主要是用来方便实现线程的各种操作&#xff0c;包括设置线程名称、优先级等及把执行方法放到队列中执行等基础性的线程操作。

 

实现代码

1&#xff09;辅助类提供的方法接口如下所示&#xff1a;

 

///


/// 线程名称&#xff0c;最长不超过10个字符&#xff01;
///

/// 线程名称
public static void SetThreadName(string name)

///
/// 设置线程优先级
///

/// 线程优先级
public static void SetThreadPriority(ThreadPriority priority)

///
/// 设置主线程的UI Culture
///

///
public static void SetMainThreadUICulture(string cultureName)

///
/// 把执行方法放到队列中&#xff0c;并指定了一个对象&#xff0c;它包含使用该方法的数据。
/// 当线程池线程变为可用的时候&#xff0c;方法执行。
///

/// 工作项(WaitCallback)对象
/// 线程名称&#xff0c;最长不超过10个字符&#xff01;
/// 线程优先级
public static bool Queue(WaitCallback callBack, string threadName, ThreadPriority priority)

///
/// 把执行方法放到队列中&#xff0c;并指定了一个对象&#xff0c;它包含使用该方法的数据。
/// 当线程池线程变为可用的时候&#xff0c;方法执行。
///

/// 工作项(WaitCallback)对象
/// 线程名称&#xff0c;最长不超过10个字符&#xff01;
/// 执行方法的数据
/// 线程优先级
public static bool Queue(WaitCallback callBack, string threadName, object state, ThreadPriority priority)

///
/// 线程休眠一段毫秒时间
///

/// 一段毫秒时间
public static void Sleep(int millisecondsTimeout)

///
/// 线程休眠一段时间
///

///
public static void Sleep(TimeSpan timeOut)

2&#xff09;辅助类ThreadHelper的使用例子代码如下所示

 

CHM帮助文档持续更新中&#xff0c;统一下载地址是&#xff1a; http://www.iqidi.com/download/commonshelp.rar 

最新公用类库DLL&#43;XML注释文件下载地址是&#xff1a;http://files.cnblogs.com/wuhuacong/WHC.OrderWater.Commons.rar 


转:https://www.cnblogs.com/wuhuacong/archive/2012/03/26/2418786.html



推荐阅读
  • ———Java培训、Android培训、iOS培训、.Net培训、期待与您交流!———一、引用计数器每个OC对象都有自己的引用计数器,表示“对象被引用 ... [详细]
  • JS加密解密
    leta=汪政..222RRRp767868^*%^*%344h哈哈;letb=udp.d(ud(a));//需要加密的内容letc=udp. ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 加密、解密、揭秘
    谈PHP中信息加密技术同样是一道面试答错的问题,面试官问我非对称加密算法中有哪些经典的算法?当时我愣了一下,因为我把非对称加密与单项散列加 ... [详细]
  • etc杂七杂八的配置文件etc不是什么缩写,是andsoon(等等)的意思来源于法语的etcetera翻译成中文就是等等的意思.至于为什么在etc下面存放配置文件& ... [详细]
  • Windows Phone 8 文件操作
    在WindowsPhone8中,操作文件的方式限制很大,对独立存储中的文件访问,可以采取两种形式:1、IsolatedSto ... [详细]
  • 这篇文章将为大家详细讲解有关C#开发技巧有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。C#开发技 ... [详细]
  • 我理解ViewHolder的onBindViewHolder如何工作,但是我不清楚notifyItemRangeChanged(0,this.data.size())如何;适用于此示例以及它的确 ... [详细]
  • Spring容器获取Bean和创建Bean都会调用getBean()方法getBean()--doGetBean()1.transformedBeanName(name);获取b ... [详细]
  • #import挂载对象所需要的参数(UIAlertView挂载对象)staticconstcharkRepresente ... [详细]
  • python 解决多张相同的excel取某一些数据合同到一张EXCEL
    这样的表单有几百张把姓名和从事专业类别代码的值取出合并到一张总表里importpandasaspdimportos#第一步读取文件储存在是s列表中pathD:001#文件夹目录fi ... [详细]
  • 利用原始socket简单实现FTP的客户端和服务器端程序
    1.设计目的本设计旨在利用原始socket简单实现FTP(FileTransferProtocol,文件传输协议)的客户端和服务器端程序,能够实现get、put、pwd、dir、cd等基 ... [详细]
  • 本文介绍了如何使用n3-charts绘制以日期为x轴的数据,并提供了相应的代码示例。通过设置x轴的类型为日期,可以实现对日期数据的正确显示和处理。同时,还介绍了如何设置y轴的类型和其他相关参数。通过本文的学习,读者可以掌握使用n3-charts绘制日期数据的方法。 ... [详细]
  • PHP引用的概念和用法详解
    本文详细介绍了PHP中引用的概念和用法。引用是指不同的变量名访问同一个变量内容,类似于Unix文件系统中的hardlink。文章从引用的定义、作用、语法和注意事项等方面进行了解释和示例。同时还介绍了对未定义变量使用引用的情况,以及在函数和new运算符中使用引用的注意事项。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有