最近由于需要在框架中提供一些自定义模板的功能,找到了一篇博客,可惜似乎是翻译工具直接翻的,读不通顺,就试着自己翻译下,我不会完全翻译原文的句子,可能会对原文进行小范围的我认为更合适的句子并添加些注释,,原文地址如下:
http://blogs.msdn.com/b/webdev/archive/2009/01/29/t4-templates-a-quick-start-guide-for-asp-net-mvc-developers.aspx
在我们最近的博客中提到的ASP.NET MVC Release Candidate中,我们使用了T4 (Text Template Transformation Toolkit)模板来实现了Add Controller和Add View的代码自动生成功能。我们希望能使用T4给大家带来开发速度上的提升,因为用户可以在很大程度上定制这些模板。
模板的位置和重写
Add Controller和Add View都是通过在后台执行T4模板来实现代码自动生成的。通过一些工具可以修改模板来定制想要生成的代码。默认模板的位置在: [Visual Studio Install Directory]\Common7\IDE\ItemTemplates\[CSharp | VisualBasic]\Web\MVC\CodeTemplates\
你也可以把“CodeTemplates”目录复制到项目的根目录以便作为每一个项目的基础在上述位置重写和定制模板(只需要创建目录名为“CodeTemplates”的目录,并在其下创建“AddController”和“AddView”的子目录即可)。需要默认目录下有一些模板的重写可能不起作用,因为自动生成代码时将会优先选取项目目录中匹配的模板。还有一个重点需要注意,你可以为Add View功能增加自己的.tt 文件,无论是在公用目录下还是独立的项目中,添加后都可以自动的显示在Add View窗口的视图选择的下拉框中。
另外,复制上述文件夹(添加.tt文件)到项目中时,都会有警告提示,如下图:
(运行这些文本模板可能会对你的电脑产生危害。如果模板来源不可信请不要运行。)
点击“Cancel”将不能使用T4模板(如果你复制“CodeTemplates”目录并增加多个.tt文件时,你都选择了“Cancel”)。因为一旦项目发现一个.tt文件,文件的“自定义工具(CustomTool①)”属性将被设置成“TextTemplatingFileGeneraror”,它会通知Visual Studio使用默认的T4宿主(Host②)去执行这个模板并且创建一个基于此模板内容的新的文件(在模板所在的目录)。
① :自定义工具是一个实现了 Visual Studio 定义的IVsSingleFileGenerator接口的特殊组件。T4 自定义工具由Microsoft.VisualStudio.TextTemplating.VSHost.TemplatedCodeGenerator类实现并且在注册表中注册在Visual Studio 下命名为TextTemplatingFileGenerator。Visual Studio 将使用该名称查找自定义工具、创建 COM 对象并调用其IVsSingleFileGenerator.Generate 方法
② :Microsoft.VisualStudio.TextTemplating.VSHost.10.0.dll 的TextTemplatingService服务实现Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost接口,为代码生成引擎提供 Host (宿主)。在模板转换过程中: Engine 负责代码生成;Host负责提供转换过程中行为具体实现及所需要的的所有外部资源,ITextTemplatingEngineHost和模板内容一起传递到Engine.ProcessTempalte方法中用于代码生成
对于基于模板的一次性文件生成或简单的使用T4,生成器都可以作为好的的实现方式---但是,因为依赖于自定义模板的宿主的Add View 和Add Controller模板都包含代码(后面会提到),使用默认的生成器执行模板将会生成错误。需要复制模板到项目中之后然后清空自定义工具属性值。
注意:如果你想去掉复制.tt文件时自动设置自定义工具的映射值,你可以通过注册表实现---注意如果你想要恢复注册表为默认值,你可以执行Visual Studio的恢复安装,或手动改回。启动注册表编辑器并且找到指定的目录(根据你的机器选择是32位还是64位):
32位:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Generators
64位:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\Generators
展开“Generators”下第一层的每一个节点并找到“.tt”。设置“(Default)”项的值为空,就可以了。
如果你想重写全局模板,并且不想复制“CodeTemplates”目录到你的项目(大概是你已经有了个同名目录),你可以通过注册表修改Add Controller 和Add View默认的目录名。启动注册表编辑器并且找到指定的目录(根据你的机器选择是32位还是64位):
32-bit: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\MVC\CodeTemplates
64-bit: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\MVC\CodeTemplates
改变“OverrideDir”项的值为你想要T4工具检索的目录名。需要注意的是,新设置的目录下依然需要保证与原来相同的目录结构,即包含“AddController”和“AddView”目录。
编辑T4模板
如果你使用Visual Studio打开一个.tt文件,你可能会发现它的内容没有层次---平铺在上面。我们强烈推荐你使用T4编辑器,一个Clarius Consulting开发的Visual Studio插件,它可以在你编辑模板时提供语法高亮和一些基本的T4语句的自动完成。有免费的“Community Edition”,以及更强大的“Professional Edition”---如果你有兴趣可以比较下不同的特性。下面你将会看到,这个插件真的让模板制作有了很大不同。
深入剖析T4模板
最简单的学习编辑自定义模板的方法是先看默认模板如何工作。为此,我们通过一些Add View的模板来了解“Create”(创建.tt文件)。现在从头开始:
这四行代码都是指令。
1.第一行是模板指令,它的主要作用是通知T4引擎,模板使用哪种语言编写。这里所说的模板使用的语言并不是模板会输出这种语言,而这种语言会控制模板的输出(例如,模板中可能会报刊一个 if-else语句用来控制哪些文本被输出)。在使用Add View 或者Add Controller之时,“HostSpecific”属性需要设置为“True”,否则模板将不能访问Add View 和Add Controller功能提供的信息(比如将类型绑定为View的强类型,等等)。
2.紧接着的是输出指令,它简单的通过通知模板宿主来设置模板输出文件的扩展名---这不是MVC特有的工具,因为根据不同情况可能会忽略默认的扩展名(例如,如果我们依赖partial view ,扩展名应该是.ascx)。
3.接下来的两行都是引用指令,C#中通常使用“using”,VB中使用“Imports”。如果你在模板中使用了用它们所写的代码,你需要在这个位置引用它们。
你可以在这里找到更多T4指令的文档:http://msdn.microsoft.com/en-us/library/bb126421.aspx
下面一点,注意一下后面的这行:
这行我们新建了一个变量“mvcHost”,将“Host”转换类型并赋值给它。因为我们指令中设置了“HostSpecific”属性为“True”,“Host”被自动提供给模板。MVC工具提供了一个自定义宿主,以便能将信息传递给只有工具内部可访问的模板。为了访问我们的宿主类中提供的这些属性,“Host”必须转换为我们自定义的宿主类型“MvcTextTemplateHost”。
这个变量的使用实际上非常简单:
首先需要注意的是,‘<#’ 和 ‘#>’标签之间包含有一些的代码。这两个标签用来调用语句块和包含控制代码。你的模板可能要有条件的输出文本块到输出文件中,同时保持其他文本块的正常输出。上面,我们有一个if语句(使用C#,因为模板的语言使用模板指令设置成了C#),使用了“{”。这个if语句的“}”出现在后面一些行中的的第17行,在不同的语句块中。注意,这里的这个if语句访问了宿主的“IsViewUserControl”属性,这个属性的作用是通知模板用户选择的是否是partial view。
模板中所有这些标记之外的文本块都会直接输出到实际的文件中。在上面的截图中,第14行的文本在标记块之外,因此会直接输出---尽管如此,它只会在12行的if语句值判断为“true”的情况下才会输出到文件中。
你可以在这里了解到更多关于T4语句块的信息:http://msdn.microsoft.com/en-us/library/bb126509.aspx
理解T4模板中控制代码的最简单的方法是在大脑中将它连接为一个完整的程序。我们之前在第6行声明的变量可以被之后的T4控制代码使用---之后每一个if-else分支条件都可以使用这个变量并且添加一些文本(灰色的)到输出的文件中。上面的If-else语句选择一些由模板宿主提供的属性传递给Add View模板。
后面一些行中有一个奇怪的语句块:
我们声明了一个“List”类型的变量。我们怎么能在T4代码中使用List类型的?因为可以看到我们在模板顶部的引用指令:
第56行调用了一个方法“FilterProperties”---但是方法在哪?实际上这个方法的定义在模板底部:
如果你仔细看,这个语句块有点不一样,是以“<#+”开始的。这是一个用来表示类的块,它们这样工作:T4模板带有所有的类的特征,并且将这些特征添加到在模板的后台编译的类中。这不只限于方法,还包括属性(通常包含在类中的)。像一个正规代码文件中的类成员一样,它们可以被模板中的其他代码访问。
关于类特征块的更多信息:http://msdn.microsoft.com/en-us/library/bb126541.aspx
我们的默认模板使用上面截图中的“FilterProperties”方法在默认输出中的type包含的标记过滤获得一些properties,这些标记必须是公共的和像GirdView一样可以在设计器中显示的。这与调用GridView .IsBindableType方法的结果在逻辑上是相同的。
(这段翻译的很别扭,所以附上原文,请大家帮忙指正)
Our default templates use the ‘FilterProperties’ method from the above screenshot to by default output markup only for some properties in the type – namely ones that are public and would also be displayed in the designer by things like GridView. This logic is identical to what you would get from calling the GridView.IsBindableType method.
在136行调用的“IsBindableType”是在模板后面一点位置被定义的:
如果你想改变我们模板过滤掉的某个属性,你可以按照你的喜好修改任意一个方法。
最后,看看第65行:
这里有一个新的标记开头“<#=”。它被一个表达式块调用并且用来插入T4代码的值到输出文本。像你在上面看到的,我们有一个foreach循环,迭代properties 并定义一个局部变量来循环调用“propertyName”。我们使用表达式块引用该变量,因为我们想为每一个属性名输出一个
标签。
更多关于表达式块:http://msdn.microsoft.com/en-us/library/bb126508.aspx
如你所见,上面各种使用T4模板的方法通过选择性的输出文本使T4成为一个强大的工具,帮助我们获得灵活的自定义的自动代码生成。
MVC工具的T4宿主属性
Add Controller 和Add View功能都通过模板宿主提供不同的属性给模板,上述说明贯穿了创建模板的过程。这里完整的列出了模板宿主的有效属性,供你的模板使用(注意:这些属性的实际名称可能会因为不同的版本有所不同)。
Add Controller:
Property Name
Type
Description
ItemName
System.String
带有“Controller”后缀的Controller类的名称
NameSpace
System.String
生成的Controller类的命名空间
ExtraActionMethods
System.Boolean
指示用户是否选择在Add Controller窗口中扩展Action方法
ControllerRootName
System.String
不带“Controller’”后缀的Controller类的名称
Add View:
Property Name
Type
Description
ItemName
System.String
不带扩展名的View名称,例如显示于Add View窗口中的
NameSpace
System.String
默认以View所在的目录作为命名空间
IsViewUserControl
System.Boolean
在Add View窗口中用户是否选择了partial view
IsViewContentPage
System.Boolean
用户创建View时是否带有master page
IsViewPage
System.Boolean
用户创建的是否是符合规范的视图页
MasterPage
System.String
用户在窗口中选择的master page路径 (只能在 IsViewContentPage是true的时候使用)
ContentPlaceholder
System.String
生成内容所在位置的占位符名称。是用户输入到Add View 窗口中内容占位符ID
ContentPlaceHolders
System.Collections.Generic.List
master page中所有内容占位符ID的列表, 如果View选择了master page
LanguageExtension
System.String
输出文件的扩展名 (包含”.”)
ViewDataTypeGenericString
System.String
在View指令中用来输出泛型”Inherits”属性的字符串(强类型 view). 例如: “” 或 “(Of MyType)”
ViewDataType
System.Type
被绑定的强类型View的Type对象。可以获得类型的属性信息等
此外,你会发现一些提供给宿主的用用的属性,比如正在执行的模板路径。更多关于这些属性: http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.texttemplating.itexttemplatingenginehost_properties.aspx
摘要
我们希望这篇文章带给了你足够关于T4模板的信息,能帮你有效的结合Visual Web Developer provides for ASP.NET MVC工具。你如果想知道这篇博客之外更多的信息,可以看看那的信息(Scott Hanselman’s博客不错)并看看你能得到什么。请回复您的评论,建议或问题。谢谢您的阅读!
你可能感兴趣的:(C#,编程规则)
【C#语言】C#中的同步与异步编程:原理、示例与最佳实践
JosieBook
# C#语言 c# 开发语言 同步异步
文章目录⭐前言⭐一、同步编程:简单但低效的线性执行代码示例执行流程示意图同步编程特点⭐二、异步编程:非阻塞的高效执行代码示例执行流程示意图异步编程核心机制适用场景⭐三、并行异步编程:最大化性能代码示例执行流程示意图并行异步优势⭐四、同步vs异步vs并行异步:对比总结⭐五、实际开发中的选择建议何时用同步?何时用异步?何时用并行异步?⭐总结标题详情作者JosieBook头衔CSDN博客专家资格、阿里云
C# Windows Forms点击事件详解
Ro小陌
Windows C# 开发语言 c# windows 开发语言
在C#WindowsForms开发中,点击事件是最基础且高频使用的交互机制。以下从底层原理、事件绑定、常见问题及高级用法四个维度进行深度解析:一、点击事件的底层机制消息循环与事件驱动WindowsForms基于Win32消息循环,所有用户操作(如点击)会被转换为WM_LBUTTONDOWN、WM_LBUTTONUP等消息。.NET通过Application.Run()启动消息循环,将消息路由到对应
C#搭建Json RPC2.0 Server/Client
Flora*.*
rpc c#
写在前面这篇文章写了改,改了写,中间耽搁好长时间,最终还是决定坚持写下来,因为我自己在学习这部分开发时也花了很长时间去理解,所以这篇文章也相当于是对我这部分开发和学习的一个总结,希望它能给你带来帮助。因为本人能力有限,所以文中有些写的不明白或者有错误的地方还请大佬批评指正,我也会不断在项目中进行总结,更新这篇文章,让其更加通俗易懂!背景介绍在MES项目开发中,我们不希望经常改动主程序,但因为不同客
STOPWATCH类
抗争到底zhy
前端
在C#中,Stopwatch类属于System.Diagnostics命名空间,它的主要用途是精准测量代码块的执行时间。在性能分析、算法优化以及其他需要时间测量的场景里,这个类非常实用。下面为你详细介绍Stopwatch类。基本使用步骤1.引入命名空间usingSystem.Diagnostics;2.创建Stopwatch实例Stopwatchstopwatch=newStopwatch();3
自动生成二维码(根据文本内容)——CAD c#二次开发
山水CAD筑梦人
CAD C#二次开发 c# 数据库 服务器
用户输入文本内容,运行插件生成二维码(jpg图片格式),扫码即可显示文本内容。※※※也可根据excel文件内容批量一键生成上万个二维码。※※※效果如下:首先需要引用库usingZXing;部分代码如下:publicclass二维码{internalstaticListtempFiles=newList();privatestaticPoint3dcurrentInsertPoint=newPoin
C#运算符与表达式详解
AitTech
C# c# 算法 开发语言
在C#编程中,运算符和表达式是构建复杂逻辑和处理数据的关键元素。以下是对C#运算符与表达式的详细解析:一、运算符运算符是一种特殊的符号,用于执行各种数学、逻辑和其他操作。C#中的运算符可以分为以下几类:算术运算符:+:加法运算符,用于将两个数值相加。-:减法运算符,用于将一个数值减去另一个数值。*:乘法运算符,用于将两个数值相乘。/:除法运算符,用于将一个数值除以另一个数值。%:取模运算符,用于获
3.4 C#的运算符和表达式详解(运算符优先级、算术运算符、逻辑运算符……)
Argonaut春
从零开始学c c# java android 运算符 表达式
文章目录C#的运算符和表达式3.4.1运算符与表达式类型1.算术运算符与算术表达式2.字符串运算符与字符串表达式3.关系运算符与关系表达式4.逻辑运算符与逻辑表达式5.条件运算符与条件表达式6.赋值运算符与赋值表达式3.4.2运算符的优先级与结合性1.运算符的优先级2.结合性示例代码C#的运算符和表达式运算符大致分为3类:一元运算符,包括前缀运算符和后缀运算符,用于处理一个操作数二元运算符,使用时
配置 VSCode 的 C# 开发环境
Q_w7742
vscode c# ide
1.安装必要的依赖1.1VSCode扩展安装C#相关插件(如C#、C#Extensions等)。1.2.NETSDK下载地址:.NETSDK下载页面1.3安装检测在命令行输入以下命令,如果正确返回了版本号,则表示.NETSDK安装成功:dotnet--version2.创建C#项目2.1使用命令行创建项目打开终端(或命令提示符)。运行以下命令以创建一个新的控制台应用程序:dotnetnewcons
C#网络通信实战:从零打造高性能Socket编程与TCP/IP协议栈应用
墨瑾轩
一起学学C#【一】 c# tcp/ip 开发语言
网络通信是现代软件开发中不可或缺的一部分,特别是在分布式系统和互联网应用中。C#提供了丰富的网络编程接口,尤其是基于Socket的TCP/IP协议栈编程,可以实现高性能的网络通信。以下从零开始逐步介绍如何在C#中使用Socket进行高性能网络通信编程,包括创建Socket、连接服务器、发送和接收数据,以及处理并发和错误等,包含详细的代码和注释。一、创建Socket CsharpusingSyste
C# 零基础入门篇(19.DateTime 使用指南)
think__deeply
c# 开发语言 visualstudio
##一、概述`DateTime`是C#中用于表示日期和时间的结构,位于`System`命名空间中。它提供了丰富的属性和方法,用于处理日期和时间的创建、格式化、比较和计算。##二、创建DateTime对象###(一)使用默认构造函数```DateTimenow=DateTime.Now;//获取当前日期和时间DateTimetoday=DateTime.Today;//获取当前日期,时间为00:00
【进阶编程】Roslyn 解析 C# 语法树(Syntax Tree)的节点详解
de之梦-御风
技术 .net 进阶编程 c#
Roslyn解析C#语法树(SyntaxTree)的节点详解Roslyn解析C#代码后会生成一棵语法树(SyntaxTree),其中每个代码元素(类、方法、变量等)都是一个语法节点(SyntaxNode)。在Roslyn中,语法树的核心结构包括:SyntaxTree(语法树)SyntaxNode(语法节点)SyntaxToken(语法标记,如关键字、标点符号)SyntaxTrivia(额外信息,如
C# WPF编程-ToggleButton
SongYuLong的博客
C# WPF开发 c# wpf 开发语言
ToggleButton在WPF中,ToggleButton是一个非常有用的控件,它允许用户在两种状态之间切换:选中(Checked)和未选中(Unchecked)。此外,还有一个中间状态叫做“不确定”(Indeterminate),但需注意的是,并不是所有的使用场景都需要或支持这个状态。下面将介绍如何使用ToggleButton,包括基本用法、样式定制以及事件处理。privatevoidTogg
C# WPF 项目实战:构建一个现代化的音乐播放器
墨夶
C#学习资料1 c# wpf 开发语言
嘿,小伙伴们!今天我们要来动手实践一个非常有趣的项目——使用C#和WPF构建一个现代化的音乐播放器。如果你是一名对桌面应用程序开发感兴趣的开发者,并且希望深入了解WPF(WindowsPresentationFoundation)框架,那么这篇文章绝对不容错过!WPF是微软推出的一款用于构建富客户端应用程序的强大框架,支持现代UI设计、数据绑定、动画和多媒体等功能。通过本文,我们将从零开始创建一个
c# 正则表达式基础知识
观无
c# 正则表达式 mysql
一、使用原理模式匹配机制:在C#中,正则表达式通过定义一种模式来描述文本的特征。例如,\d表示匹配任意一个数字字符。当使用正则表达式进行匹配时,正则表达式引擎会从输入文本的起始位置开始,逐个字符地将输入文本与模式进行比较。引擎尝试找到一个连续的字符序列,该序列与整个模式完全匹配。如果找到了这样的序列,则匹配成功;否则,匹配失败。回溯机制:当正则表达式中存在可选部分(如a?表示a可选出现一次或不出现
C# BindingFlags 使用详解
鲤籽鲲
C# c# C# 知识捡漏 开发语言
总目录前言在C#编程的世界里,反射(Reflection)是一个强大且灵活的特性,它允许我们在运行时动态地获取和操作类型的信息。而BindingFlags枚举类型,作为反射中的核心概念之一,为我们提供了精确控制类型成员查找和操作的能力(通过组合多个标志来指定搜索类型如字段、方法、属性等成员的条件)。今天,就让我们深入探讨BindingFlags的使用,解锁反射的更多可能性。一、什么是Binding
C# 中泛型(Generics)的核心概念
ByteGeek
C#基础从入门到精通 c# windows 开发语言
在C#中,泛型(Generics)是一种强大的编程特性,允许你编写可重用、类型安全的代码,而无需为不同类型重复编写相似的逻辑。泛型的核心思想是参数化类型,即通过占位符(如T)表示类型,在编译时确定具体类型。以下是泛型的详细讲解:1.泛型的基本概念类型参数化:用占位符(如T、TKey、TValue)代替具体类型。编译时类型安全:泛型在编译时检查类型一致性,避免运行时类型错误。避免装箱
【C#高级编程】—表达式树详解
_Csharp
C#基础-高阶-实战知识点 c# 开发语言 表达式 表达式树
表达式树详解什么是表达式树?C#表达式树(ExpressionTrees)是一种将代码表示为数据结构的技术,允许在运行时分析、转换和执行代码逻辑。表达式树是一种树形数据结构,它将代码(例如Lambda表达式)表示为对象。每个节点代表一个操作(例如加法、减法、调用方法等),而子节点代表操作的操作数。基本概念数据结构表示:表达式树以树形结构表示代码(如lambda表达式),每个节点代表一个操作(如方法
C#运算符与表达式:从入门到游戏伤害计算实践
吴师兄大模型
C#编程从入门到进阶 c# 游戏 开发语言 运算符 表达式 变成 游戏程序
Langchain系列文章目录01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南02-玩转LangChainMemory模块:四种记忆类型详解及应用场景全覆盖03-全面掌握LangChain:从核心链条构建到动态任务分配的实战指南04-玩转LangChain:从文档加载到高效问答系统构建的全程实战05-玩转LangChain:深度评估问答系统的三种高效方法(示例生成、手
从入门到精通: C#100个关键技术关键词
_老码
从入门到精通 c# 开发语言
C#是一种强大而灵活的面向对象编程语言,由Microsoft在2000年创建,主要用于.NET框架。通过掌握本指南中的100个关键技术关键词,你将逐步了解C#的核心概念、基本语法、面向对象编程、异常处理、文件操作、标准库等方面的知识。每个关键词都配有详细的注释,帮助你轻松理解和应用。让我们一起开始这段精彩的C#学习之旅吧!基础概念C#-一种面向对象的编程语言,由Microsoft在2000年创建,
C#入门:从变量与数据类型开始你的游戏开发之旅
吴师兄大模型
C#编程从入门到进阶 c# 开发语言 变量与数据类型 游戏开发 Unity基础 C#变量 数据类型
Langchain系列文章目录01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南02-玩转LangChainMemory模块:四种记忆类型详解及应用场景全覆盖03-全面掌握LangChain:从核心链条构建到动态任务分配的实战指南04-玩转LangChain:从文档加载到高效问答系统构建的全程实战05-玩转LangChain:深度评估问答系统的三种高效方法(示例生成、手
5大陷阱+实战:C#日志分析,从‘日志迷宫’到‘监控神殿’的逆袭全攻略!
墨瑾轩
C#乐园 c# 网络 开发语言
关注墨瑾轩,带你探索编程的奥秘!超萌技术攻略,轻松晋级编程高手技术宝库已备好,就等你来挖掘订阅墨瑾轩,智趣学习不孤单即刻启航,编程之旅更有趣你的日志还在‘打哑谜’吗?“错误日志像‘天书’读不懂?监控告警像‘哑巴’不发声?”——别慌!今天用C#日志分析,让你的系统像“福尔摩斯”一样精准破案,从实时监控到根因定位,从此告别“黑盒运维”!权威背书:日志分析≠‘抄作业’!“90%的故障因‘日志解析缺失’导
C# 事件机制详解:定义、订阅、触发与应用实践
江沉晚呤时
C# c# java 前端 .netcore
在C#中,事件(Event)是面向对象编程中的一种重要特性,主要用于处理对象之间的通知和消息传递。通过事件机制,某个对象(事件发布者)可以通知其他对象(事件订阅者)发生了一些重要的变化,通常用于实现发布-订阅模式(Publisher-Subscriber)。这使得代码在响应外部或内部的变化时更加松散耦合,易于维护和扩展。本文将深入探讨C#中的事件机制,解释事件的定义、订阅、触发、生命周期管理、常见
深入解析 C# Lambda 表达式
江沉晚呤时
C# lucene .netcore net c# asp.net
C#中的Lambda表达式为开发者提供了一种简洁、灵活的方式来编写匿名方法或委托。随着C#的版本不断更新,Lambda表达式变得越来越重要,特别是在LINQ(语言集成查询)、事件处理、回调以及其他函数式编程场景中。本文将详细讲解C#Lambda表达式的概念、语法、应用及其与委托、匿名方法的关系,帮助你更好地理解和运用Lambda表达式。1.什么是Lambda表达式?Lambda表达式是一种可以在没
YOLOv8n-OBB使用C#在windows10进行部署(CPU)
cd_Ww777
YOLO
1.训练YOLOv8-OBB模型1.1数据集制作所用标注工具:X-AnyLabeling下载链接:https://github.com/CVHub520/X-AnyLabeling/releases/download/v2.3.6/X-AnyLabeling-CPU.exe附上两张图片为标注过程中的重要步骤;标注快捷键的使用具体参考官方文档,附图为简单实用的快捷键。https://github.c
C#学习笔记(3): 调用YOLOv8
playerofIE
c# 学习 笔记 YOLO python
最近做的项目需要C#编写上位机程序,同时也要使用yolo进行深度学习检测。使用pythonnet调用写好的py文件,C#代码如下:Runtime.PythonDLL="python310.dll";PythonEngine.Initialize();using(Py.GIL()){dynamicsys=Py.Import("sys");dynamictorch=Py.Import("torch")
YOLOv8 的简介 及C#中如何简单应用YOLOv8
码上有潜
YOLOv8 YOLO
YOLOv8是YOLO(YouOnlyLookOnce)系列中的最新版本,是一种用于目标检测和图像分割的深度学习模型。YOLO模型以其快速和准确的目标检测性能而著称,广泛应用于实时应用程序中。主要特点高效性:YOLOv8在保持高检测速度的同时,进一步提高了检测精度。端到端训练:可以直接从图像输入端到分类结果输出,简化了训练和部署过程。改进的架构:包括更深的网络结构、更复杂的特征提取方法以及更高效的
C#——如何定义事件
稀饭鸡蛋
c# 开发语言 microsoft
在C#编程语言中,事件(Event)是一种允许类或对象通知其他类或对象发生某种情况的机制。事件通常与委托(Delegate)一起使用,委托可以被视为事件的数据类型,它定义了可以对事件进行处理的方法的签名。使用自定义委托定义事件首先,我们可以自定义一个委托类型,然后基于这个委托类型定义事件。例如://定义一个委托类型publicdelegatevoidMyEventHandler(stringmes
利用 Python 打包 DLL 供 C# 调用的实现与解析
汪子熙
Python python c# microsoft
在现代软件开发中,跨语言调用是一项十分常见的需求。比如题主需求提到的把Python应用打包成dll,供C#程序调用。Python提供了多个模块和工具支持与其他语言的交互。利用ctypes或cffi模块,以及pybind11,我们可以将Python函数封装为C接口。同时,借助pyinstaller等工具,我们可以将Python程序打包为独立运行的二进制文件。技术选择ctypes和cffi:提供了与C
Razor C# 变量
lsx202406
开发语言
RazorC#变量引言在ASP.NETMVC和Razor视图引擎中,变量是构建动态网页的基础。理解RazorC#变量的使用对于开发者来说至关重要。本文将详细介绍RazorC#变量的概念、类型、作用域以及如何在实际项目中有效使用它们。一、RazorC#变量的概念RazorC#变量是存储在Razor视图中的数据容器。它们可以存储任何类型的值,如字符串、数字、布尔值等。在Razor视图中,变量通过@符号
C#—【特性详解以及自定义特性和通过反射读取特性】
_Csharp
C#基础-高阶-实战知识点 c# 开发语言 特性 反射 自定义特性
C#—【特性详解以及自定义特性和通过反射读取特性】目录C#—【特性详解以及自定义特性和通过反射读取特性】介绍:特性可以用于多种用途,包括但不限于:特性的分类:特性的主要用途(举一些直观例子)1.标记代码,让框架自动处理2.数据验证(表单/模型校验)3.控制序列化行为4.生成文档(如API接口说明)5.实现AOP(面向切面编程)为什么用特性而不用其他方法?日常开发中的高频场景一句话总结常见预定义特性
矩阵求逆(JAVA)初等行变换
qiuwanchi
矩阵求逆(JAVA)
package gaodai.matrix;
import gaodai.determinant.DeterminantCalculation;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* 矩阵求逆(初等行变换)
* @author 邱万迟
*
JDK timer
antlove
java jdk schedule code timer
1.java.util.Timer.schedule(TimerTask task, long delay):多长时间(毫秒)后执行任务
2.java.util.Timer.schedule(TimerTask task, Date time):设定某个时间执行任务
3.java.util.Timer.schedule(TimerTask task, long delay,longperiod
JVM调优总结 -Xms -Xmx -Xmn -Xss
coder_xpf
jvm 应用服务器
堆大小设置JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。
典型设置:
java -Xmx
JDBC连接数据库
Array_06
jdbc
package Util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCUtil {
//完
Unsupported major.minor version 51.0(jdk版本错误)
oloz
java
java.lang.UnsupportedClassVersionError: cn/support/cache/CacheType : Unsupported major.minor version 51.0 (unable to load class cn.support.cache.CacheType)
at org.apache.catalina.loader.WebappClassL
用多个线程处理1个List集合
362217990
多线程 thread list 集合
昨天发了一个提问,启动5个线程将一个List中的内容,然后将5个线程的内容拼接起来,由于时间比较急迫,自己就写了一个Demo,希望对菜鸟有参考意义。。
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
public c
JSP简单访问数据库
香水浓
sql mysql jsp
学习使用javaBean,代码很烂,仅为留个脚印
public class DBHelper {
private String driverName;
private String url;
private String user;
private String password;
private Connection connection;
privat
Flex4中使用组件添加柱状图、饼状图等图表
AdyZhang
Flex
1.添加一个最简单的柱状图
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
<?xml version=
"1.0"&n
Android 5.0 - ProgressBar 进度条无法展示到按钮的前面
aijuans
android
在低于SDK < 21 的版本中,ProgressBar 可以展示到按钮前面,并且为之在按钮的中间,但是切换到android 5.0后进度条ProgressBar 展示顺序变化了,按钮再前面,ProgressBar 在后面了我的xml配置文件如下:
[html]
view plain
copy
<RelativeLa
查询汇总的sql
baalwolf
sql
select list.listname, list.createtime,listcount from dream_list as list , (select listid,count(listid) as listcount from dream_list_user group by listid order by count(
Linux du命令和df命令区别
BigBird2012
linux
1,两者区别
du,disk usage,是通过搜索文件来计算每个文件的大小然后累加,du能看到的文件只是一些当前存在的,没有被删除的。他计算的大小就是当前他认为存在的所有文件大小的累加和。
AngularJS中的$apply,用还是不用?
bijian1013
JavaScript AngularJS $apply
在AngularJS开发中,何时应该调用$scope.$apply(),何时不应该调用。下面我们透彻地解释这个问题。
但是首先,让我们把$apply转换成一种简化的形式。
scope.$apply就像一个懒惰的工人。它需要按照命
[Zookeeper学习笔记十]Zookeeper源代码分析之ClientCnxn数据序列化和反序列化
bit1129
zookeeper
ClientCnxn是Zookeeper客户端和Zookeeper服务器端进行通信和事件通知处理的主要类,它内部包含两个类,1. SendThread 2. EventThread, SendThread负责客户端和服务器端的数据通信,也包括事件信息的传输,EventThread主要在客户端回调注册的Watchers进行通知处理
ClientCnxn构造方法
&
【Java命令一】jmap
bit1129
Java命令
jmap命令的用法:
[hadoop@hadoop sbin]$ jmap
Usage:
jmap [option] <pid>
(to connect to running process)
jmap [option] <executable <core>
(to connect to a
Apache 服务器安全防护及实战
ronin47
此文转自IBM.
Apache 服务简介
Web 服务器也称为 WWW 服务器或 HTTP 服务器 (HTTP Server),它是 Internet 上最常见也是使用最频繁的服务器之一,Web 服务器能够为用户提供网页浏览、论坛访问等等服务。
由于用户在通过 Web 浏览器访问信息资源的过程中,无须再关心一些技术性的细节,而且界面非常友好,因而 Web 在 Internet 上一推出就得到
unity 3d实例化位置出现布置?
brotherlamp
unity教程 unity unity资料 unity视频 unity自学
问:unity 3d实例化位置出现布置?
答:实例化的同时就可以指定被实例化的物体的位置,即 position
Instantiate (original : Object, position : Vector3, rotation : Quaternion) : Object
这样你不需要再用Transform.Position了,
如果你省略了第二个参数(
《重构,改善现有代码的设计》第八章 Duplicate Observed Data
bylijinnan
java 重构
import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.Label;
import java.awt.TextField;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusE
struts2更改struts.xml配置目录
chiangfai
struts.xml
struts2默认是读取classes目录下的配置文件,要更改配置文件目录,比如放在WEB-INF下,路径应该写成../struts.xml(非/WEB-INF/struts.xml)
web.xml文件修改如下:
<filter>
<filter-name>struts2</filter-name>
<filter-class&g
redis做缓存时的一点优化
chenchao051
redis hadoop pipeline
最近集群上有个job,其中需要短时间内频繁访问缓存,大概7亿多次。我这边的缓存是使用redis来做的,问题就来了。
首先,redis中存的是普通kv,没有考虑使用hash等解结构,那么以为着这个job需要访问7亿多次redis,导致效率低,且出现很多redi
mysql导出数据不输出标题行
daizj
mysql 数据导出 去掉第一行 去掉标题
当想使用数据库中的某些数据,想将其导入到文件中,而想去掉第一行的标题是可以加上-N参数
如通过下面命令导出数据:
mysql -uuserName -ppasswd -hhost -Pport -Ddatabase -e " select * from tableName" > exportResult.txt
结果为:
studentid
phpexcel导出excel表简单入门示例
dcj3sjt126com
PHP Excel phpexcel
先下载PHPEXCEL类文件,放在class目录下面,然后新建一个index.php文件,内容如下
<?php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
if (PHP_SAPI == 'cli')
die('
爱情格言
dcj3sjt126com
格言
1) I love you not because of who you are, but because of who I am when I am with you. 我爱你,不是因为你是一个怎样的人,而是因为我喜欢与你在一起时的感觉。 2) No man or woman is worth your tears, and the one who is, won‘t
转 Activity 详解——Activity文档翻译
e200702084
android UI sqlite 配置管理 网络应用
activity 展现在用户面前的经常是全屏窗口,你也可以将 activity 作为浮动窗口来使用(使用设置了 windowIsFloating 的主题),或者嵌入到其他的 activity (使用 ActivityGroup )中。 当用户离开 activity 时你可以在 onPause() 进行相应的操作 。更重要的是,用户做的任何改变都应该在该点上提交 ( 经常提交到 ContentPro
win7安装MongoDB服务
geeksun
mongodb
1. 下载MongoDB的windows版本:mongodb-win32-x86_64-2008plus-ssl-3.0.4.zip,Linux版本也在这里下载,下载地址: http://www.mongodb.org/downloads
2. 解压MongoDB在D:\server\mongodb, 在D:\server\mongodb下创建d
Javascript魔法方法:__defineGetter__,__defineSetter__
hongtoushizi
js
转载自: http://www.blackglory.me/javascript-magic-method-definegetter-definesetter/
在javascript的类中,可以用defineGetter和defineSetter_控制成员变量的Get和Set行为
例如,在一个图书类中,我们自动为Book加上书名符号:
function Book(name){
错误的日期格式可能导致走nginx proxy cache时不能进行304响应
jinnianshilongnian
cache
昨天在整合某些系统的nginx配置时,出现了当使用nginx cache时无法返回304响应的情况,出问题的响应头: Content-Type:text/html; charset=gb2312 Date:Mon, 05 Jan 2015 01:58:05 GMT Expires:Mon , 05 Jan 15 02:03:00 GMT Last-Modified:Mon, 05
数据源架构模式之行数据入口
home198979
PHP 架构 行数据入口
注:看不懂的请勿踩,此文章非针对java,java爱好者可直接略过。
一、概念
行数据入口(Row Data Gateway):充当数据源中单条记录入口的对象,每行一个实例。
二、简单实现行数据入口
为了方便理解,还是先简单实现:
<?php
/**
* 行数据入口类
*/
class OrderGateway {
/*定义元数
Linux各个目录的作用及内容
pda158
linux 脚本
1)根目录“/” 根目录位于目录结构的最顶层,用斜线(/)表示,类似于
Windows
操作系统的“C:\“,包含Fedora操作系统中所有的目录和文件。 2)/bin /bin 目录又称为二进制目录,包含了那些供系统管理员和普通用户使用的重要
linux命令的二进制映像。该目录存放的内容包括各种可执行文件,还有某些可执行文件的符号连接。常用的命令有:cp、d
ubuntu12.04上编译openjdk7
ol_beta
HotSpot jvm jdk OpenJDK
获取源码
从openjdk代码仓库获取(比较慢)
安装mercurial Mercurial是一个版本管理工具。 sudo apt-get install mercurial
将以下内容添加到$HOME/.hgrc文件中,如果没有则自己创建一个: [extensions] forest=/home/lichengwu/hgforest-crew/forest.py fe
将数据库字段转换成设计文档所需的字段
vipbooks
设计模式 工作 正则表达式
哈哈,出差这么久终于回来了,回家的感觉真好!
PowerDesigner的物理数据库一出来,设计文档中要改的字段就多得不计其数,如果要把PowerDesigner中的字段一个个Copy到设计文档中,那将会是一件非常痛苦的事情。