锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
There are four main ways to do interop in .NET between the managed and native worlds. COM interop can be accomplished using Runtime Callable Wrappers (RCW) and COM Callable Wrappers (CCW). The common language runtime (CLR) is responsible for type marshaling (except in the rare scenarios where a custom marshaler is used) and the cost of these calls can be expensive. You need to be careful that the interfaces are not too chatty; otherwise a large performance penalty could result. You also need to ensure that the wrappers are kept up to date with the underlying component. That said, COM interop is very useful for simple interop scenarios where you are attempting to bring in a large amount of native COM code.
The second option for interop is to use P/Invoke. This is accomplished using the DllImport attribute, specifying the attribute on the method declaration for the function you want to import. Marshaling is handled according to how it has been specified in the declaration. However, DllImport is only useful if you have code that exposes the required functions through a DLL export.
When you need to call managed code from native code, CLR hosting is an option. In such a scenario, the native application has to drive all of the execution: setting up the host, binding to the runtime, starting the host, retrieving the appropriate AppDomain, setting up the invocation context, locating the desired assembly and class, and invoking the operation on the desired class. This is definitely one of the most robust solutions in terms of control over what and when things happen, but it is also incredibly tedious and requires a lot of custom code.
The fourth option, and quite possibly the easiest and the most performant, is to use the interop capabilities in C++. By throwing the /clr switch, the compiler generates MSIL instead of native machine code. The only code that is generated as native machine code is code that just can't be compiled to MSIL, including functions with inline asm blocks and operations that use CPU-specific intrinsics such as Streaming SIMD Extensions (SSE). The /clr switch is how the Quake II port to .NET was accomplished. The Vertigo software team spent a day porting the original C code for the game to code that successfully compiled as C++ and then threw the /clr switch. In no time they were up and running on the .NET Framework. Without adding any additional binaries and simply by including the appropriate header files, managed C++ and native C++ can call each other without any additional work on the part of the developer. The compiler handles the creation of the appropriate thunks to go back and forth between the two worlds.
/O1 | 鍒涘緩灝忎唬鐮?/td> |
/O2 | 鍒涘緩蹇熶唬鐮?/td> |
/Oa | 鍋囪娌℃湁鍒悕 |
/Ob | 鎺у埗鍐呰仈灞曞紑 |
/Od | 紱佺敤浼樺寲 |
/Og | 浣跨敤鍏ㄥ眬浼樺寲 |
/Oi | 鐢熸垚鍐呴儴鍑芥暟 |
/Op | 鏀瑰杽嫻偣鏁頒竴鑷存?/td> |
/Os | 浠g爜澶у皬浼樺厛 |
/Ot | 浠g爜閫熷害浼樺厛 |
/Ow | 鍋囧畾鍦ㄥ嚱鏁拌皟鐢ㄤ腑浣跨敤鍒悕 |
/Ox | 浣跨敤鏈澶т紭鍖?(/Ob2gity /Gs) |
/Oy | 鐪佺暐妗嗘灦鎸囬拡 |
浠g爜鐢熸垚
/arch | 浣跨敤 SSE 鎴?SSE2 鎸囦護鐢熸垚浠g爜 |
/clr | 鍚敤 C++ 鐨勬墭綆℃墿灞曞茍浜х敓鍦ㄥ叕鍏辮璦榪愯搴撲笂榪愯鐨勮緭鍑烘枃浠?/td> |
/EH | 鎸囧畾寮傚父澶勭悊妯″瀷 |
/G3 | 浼樺寲浠g爜浠ヤ紭閫?386 澶勭悊鍣ㄣ傚湪 Visual C++ 5.0 涓凡緇忓仠鐢紝緙栬瘧鍣ㄥ皢蹇界暐姝ら夐」 |
/G4 | 浼樺寲浠g爜浠ヤ紭閫?486 澶勭悊鍣ㄣ傚湪 Visual C++ 5.0 涓凡緇忓仠鐢紝緙栬瘧鍣ㄥ皢蹇界暐姝ら夐」 |
/G5 | 浼樺寲浠g爜浠ヤ紭閫?Pentium |
/G6 | 浼樺寲浠g爜浠ヤ紭閫?Pentium Pro銆丳entium II 鍜?Pentium III 澶勭悊鍣?/td> |
/G7 | 閽堝 Pentium 4 鎴?Athlon 浼樺寲浠g爜銆?/td> |
/GB | 涓?/G6 絳夋晥錛涘皢 _M_IX86 鐨勫艱緗負 600 |
/Gd | 浣跨敤 __cdecl 璋冪敤綰﹀畾 |
/Ge | 嬋媧誨爢鏍堟帰嫻?/td> |
/GF
/Gf |
鍚敤瀛楃涓叉睜 |
/Gh | 璋冪敤鎸傞挬鍑芥暟 _penter |
/GH | 璋冪敤鎸傞挬鍑芥暟 _pexit |
/GL | 鍚敤鍏ㄧ▼搴忎紭鍖?/td> |
/Gm | 鍚敤鏈灝忛噸鏂扮敓鎴?/td> |
/GR | 鍚敤榪愯鏃剁被鍨嬩俊鎭?(RTTI) |
/Gr | 浣跨敤 __fastcall 璋冪敤綰﹀畾 |
/Gs | 鎺у埗鍫嗘爤鎺㈡祴 |
/GT | 鏀寔浣跨敤闈欐佺嚎紼嬫湰鍦板瓨鍌ㄥ尯鍒嗛厤鐨勬暟鎹殑綰ょ▼瀹夊叏 |
/GX | 鍚敤鍚屾寮傚父澶勭悊 |
/Gy | 鍚敤鍑芥暟綰ч摼鎺?/td> |
/Gz | 浣跨敤 __stdcall 璋冪敤綰﹀畾 |
/MD | 浣跨敤 MSVCRT.lib 鍒涘緩澶氱嚎紼?DLL |
/MDd | 浣跨敤 MSVCRTD.lib 鍒涘緩璋冭瘯澶氱嚎紼?DLL |
/ML | 浣跨敤 LIBC.lib 鍒涘緩鍗曠嚎紼嬪彲鎵ц鏂囦歡 |
/MLd | 浣跨敤 LIBCD.lib 鍒涘緩璋冭瘯鍗曠嚎紼嬪彲鎵ц鏂囦歡 |
/MT | 浣跨敤 LIBCMT.lib 鍒涘緩澶氱嚎紼嬪彲鎵ц鏂囦歡 |
/MTd | 浣跨敤 LIBCMTD.lib 鍒涘緩璋冭瘯澶氱嚎紼嬪彲鎵ц鏂囦歡 |
杈撳嚭鏂囦歡
/FA
/Fa |
鍒涘緩鍒楄〃鏂囦歡 璁劇疆鍒楄〃鏂囦歡鍚?/td> |
/Fd | 閲嶅懡鍚嶇▼搴忔暟鎹簱鏂囦歡 |
/Fe | 閲嶅懡鍚嶅彲鎵ц鏂囦歡 |
/Fm | 鍒涘緩鏄犲皠鏂囦歡 |
/Fo | 鍒涘緩瀵硅薄鏂囦歡 |
/Fp | 鎸囧畾棰勭紪璇戝ご鏂囦歡鍚?/td> |
/FR
/FR |
鐢熸垚嫻忚鍣ㄦ枃浠?/td> |
/Fx | 灝嗘彃鍏ョ殑浠g爜涓庢簮鏂囦歡鍚堝茍 |
璋冭瘯
/GS | 緙撳啿鍖哄畨鍏ㄦ鏌?/td> |
/GZ | 涓?/RTC1 鐩稿悓 |
/RTC | 鍚敤榪愯鏃墮敊璇鏌?/td> |
/Wp64 | 媯嫻?64 浣嶅彲縐繪鎬ч棶棰?/td> |
/Yd | 灝嗗畬鏁寸殑璋冭瘯淇℃伅鏀懼湪鎵鏈夊璞℃枃浠朵腑 |
/Yl | 鍒涘緩璋冭瘯搴撴椂鎻掑叆 PCH 寮曠敤 |
/Z7 | 鐢熸垚涓?C 7.0 鍏煎鐨勮皟璇曚俊鎭?/td> |
/Zd | 鐢熸垚琛屽彿 |
/Zi | 鐢熸垚瀹屾暣鐨勮皟璇曚俊鎭?/td> |
棰勫鐞嗗櫒
/AI | 鎸囧畾鍦ㄨВ鏋愪紶閫掑埌 #using 鎸囦護鐨勬枃浠跺紩鐢ㄦ椂鎼滅儲鐨勭洰褰?/td> |
/C | 鍦ㄩ澶勭悊鏈熼棿淇濈暀娉ㄩ噴 |
/D | 瀹氫箟甯告暟鍜屽畯 |
/E | 灝嗛澶勭悊鍣ㄨ緭鍑哄鍒跺埌鏍囧噯杈撳嚭 |
/EP | 灝嗛澶勭悊鍣ㄨ緭鍑哄鍒跺埌鏍囧噯杈撳嚭 |
/Fl | 棰勫鐞嗘寚瀹氱殑鍖呭惈鏂囦歡 |
/FU | 寮哄埗浣跨敤鏂囦歡鍚嶏紝灝卞儚瀹冨凡琚紶閫掑埌 #using 鎸囦護涓鏍?/td> |
/I | 鍦ㄧ洰褰曚腑鎼滅儲鍖呭惈鏂囦歡 |
/P | 灝嗛澶勭悊鍣ㄨ緭鍑哄啓鍏ユ枃浠?/td> |
/U | 縐婚櫎棰勫畾涔夊畯 |
/u | 縐婚櫎鎵鏈夌殑棰勫畾涔夊畯 |
/X | 蹇界暐鏍囧噯鍖呭惈鐩綍 |
/ZI | 灝嗚皟璇曚俊鎭寘鍚湪涓庘滅紪杈戝茍緇х畫鈥濆吋瀹圭殑紼嬪簭鏁版嵁搴撲腑 |
璇█
/vd | 鍙栨秷鎴栧惎鐢ㄩ殣钘忕殑 vtordisp 綾繪垚鍛?/td> |
/vmb | 瀵規寚鍚戞垚鍛樼殑鎸囬拡浣跨敤鏈浣崇殑鍩?/td> |
/vmg | 瀵規寚鍚戞垚鍛樼殑鎸囬拡浣跨敤瀹屽叏涓鑸?/td> |
/vmm | 澹版槑澶氶噸緇ф壙 |
/vms | 澹版槑鍗曚竴緇ф壙 |
/vmv | 澹版槑铏氭嫙緇ф壙 |
/Za | 紱佺敤璇█鎵╁睍 |
/Zc | 鍦?/Ze 涓嬫寚瀹氭爣鍑嗚涓?/td> |
/Ze | 鍚敤璇█鎵╁睍 |
/Zg | 鐢熸垚鍑芥暟鍘熷瀷 |
/Zl | 浠?.obj 鏂囦歡涓Щ闄ら粯璁ゅ簱鍚?/td> |
/Zp n | 灝佽緇撴瀯鎴愬憳 |
/Zs | 鍙鏌ヨ娉?/td> |
閾炬帴
/F | 璁劇疆鍫嗘爤澶у皬 |
/LD | 鍒涘緩鍔ㄦ侀摼鎺ュ簱 |
/LDd | 鍒涘緩璋冭瘯鍔ㄦ侀摼鎺ュ簱 |
/link | 灝嗘寚瀹氱殑閫夐」浼犻掔粰 LINK |
/MD | 浣跨敤 MSVCRT.lib 緙栬瘧浠ュ垱寤哄綰跨▼ DLL |
/MDd | 浣跨敤 MSVCRTD.lib 緙栬瘧浠ュ垱寤鴻皟璇曞綰跨▼ DLL |
/ML | 浣跨敤 LIBC.lib 緙栬瘧浠ュ垱寤哄崟綰跨▼鍙墽琛屾枃浠?/td> |
/MLd | 浣跨敤 LIBCD.lib 緙栬瘧浠ュ垱寤鴻皟璇曞崟綰跨▼鍙墽琛屾枃浠?/td> |
/MT | 浣跨敤 LIBCMT.lib 緙栬瘧浠ュ垱寤哄綰跨▼鍙墽琛屾枃浠?/td> |
/MTd | 浣跨敤 LIBCMTD.lib 緙栬瘧浠ュ垱寤鴻皟璇曞綰跨▼鍙墽琛屾枃浠?/td> |
棰勭紪璇戝ご
/Y- | 蹇界暐褰撳墠鐢熸垚涓殑鎵鏈夊叾浠栭緙栬瘧澶寸紪璇戝櫒閫夐」 |
/Yc | 鍒涘緩棰勭紪璇戝ご鏂囦歡 |
/Yd | 灝嗗畬鏁寸殑璋冭瘯淇℃伅鏀懼湪鎵鏈夊璞℃枃浠朵腑 |
/Yu | 鍦ㄧ敓鎴愭湡闂翠嬌鐢ㄩ緙栬瘧澶存枃浠?/td> |
/YX | 鑷姩澶勭悊棰勭紪璇戝ご |
鏉傞」
@ | 鎸囧畾鍝嶅簲鏂囦歡 |
/? | 鍒楀嚭緙栬瘧鍣ㄩ夐」 |
/c | 緙栬瘧浣嗕笉閾炬帴 |
/H | 闄愬埗澶栭儴錛堝叕鍏憋級鍚嶇О鐨勯暱搴?/td> |
/HELP | 鍒楀嚭緙栬瘧鍣ㄩ夐」 |
/J | 鏇存敼榛樿鐨?char 綾誨瀷 |
/nologo | 鍙栨秷鏄劇ず鐧誨綍鐗堟潈鏍囧織 |
/QI0f | 紜繚 Pentium 0F 鎸囦護娌℃湁闂 |
/QIfdiv | FDIV銆丗PREM銆丗PTAN 鍜?FPATAN 鎸囦護鏈夌己闄風殑 Intel Pentium 寰鐞嗗櫒鐨勫彉閫氭柟娉?/td> |
QIfist | 褰撻渶瑕佷粠嫻偣綾誨瀷杞崲涓烘暣鍨嬫椂鍙栨秷 Helper 鍑芥暟 _ftol 鐨勮皟鐢?/td> |
/showIncludes | 鍦ㄧ紪璇戞湡闂存樉紺烘墍鏈夊寘鍚枃浠剁殑鍒楄〃 |
/Tc
/TC |
鎸囧畾 C 婧愭枃浠?/td> |
/Tp
/TP |
鎸囧畾 C++ 婧愭枃浠?/td> |
/V | 璁劇疆鐗堟湰瀛楃涓?/td> |
/W | 璁劇疆璀﹀憡絳夌駭 |
/w | 紱佺敤鎵鏈夎鍛?/td> |
/Wall | 鍚敤鎵鏈夎鍛婏紝鍖呮嫭榛樿鎯呭喌涓嬬鐢ㄧ殑璀﹀憡 |
/WL | 鍦ㄤ粠鍛戒護琛岀紪璇?C++ 婧愪唬鐮佹椂鍚敤閿欒淇℃伅鍜岃鍛婃秷鎭殑鍗曡璇婃柇 |
/Zm | 鎸囧畾棰勭紪璇戝ご鍐呭瓨鍒嗛厤闄愬埗 |
C/C++ 鐢熸垚鍙傝?/a> | 緙栬瘧鍣ㄩ夐」 | 璁劇疆緙栬瘧鍣ㄩ夐」
When you have a "mystery" bug to solve, tracepoints are a vital part of your debugging arsenal. Single stepping and looking through code can be S-L-O-O-O-O-W and if you don't even know what you're looking for, it can consume hours and hours of effort. Tracepoints really speed things up. They're like breakpoints that don't break. In a way, they go back to the old "printf debugging" -- but you don't need to make code changes and recompile to change them.
To set a tracepoint, first set a breakpoint, then right-click on the red dot that appears in the margin and choose When Hit:
In the dialog that appears, click the Print A Message box and edit the starter message you are given. You can include any expression in braces and it will be evaluated when control reaches the tracepoint:
Leave the Continue Execution box checked so that you don't break. Tracepoints are identified by red diamonds instead of red dots:
The output from the tracepoints appears in the output window of your debug session:
You can set up something suspicious, let it run, then pore through the tracepoint output and see what you learn. It's a huge timesaver when you're tackling a "we don't even know where to start" bug. Plus, if the issue is related to threading or async issues in any way (and you know me, I keep preaching we will all be facing async issues eventually) then you don't have to worry that pausing execution suppresses the collisions. I recently helped a client solve a big hairy this-stuff-fails-for-our-biggest-customer-only bug using tracepoints... and a few other tricks I will cover in upcoming posts.
Conditional breakpoints were another really important tool in solving a recent "only happens at the big installations" bug in a big and complicated C++ application. We wanted to debug the code with as few rebuilds as possible and we really didn't know how parts of it worked at all. Tracepoints helped us to figure out a lot of it in a short time. We didn't have a decent repro case though, so here's what we did:
Now we ran some queries on the morning version of the database to confirm that at least one X was missing a Y that should have been calculated overnight. We even had the Xid. Thanks to the tracepoint work of the previous day we knew where to be suspicious. A little digging in the trigger output told us whether the problem was "didn't get added" or "got added, but then got deleted". The last step was conditional breakpoints. These let us say "only stop here when you're processing the X with this Xid."
This really saves time when you just need to drill into what's happening in the case that is going wrong. You get to it by right clicking the red dot or diamond and choosing Condition.
Conditional breakpoints are cool when you know the value of one variable that is associated with trouble: this only blows up when Xid is 1234. They can also be used to reduce the boredom of single stepping. Say you've got some loop that goes around a few hundred times building up some string or array or something. You don't want to keep going round and round and round... it would be nice to jump ahead to halfway through, for example, and see how things are looking. Now if this is a for loop with a handy named variable, say
for (int i = 0; i<1000; i++)
Then you can use a conditional breakpoint and say "stop when i is 200". Or you could be clever and stop when i % 200 is 0 -- so that's every 200 times. But what if there's no i? What if you're going through a file or a recordset/dataset/resultset and you're going until the end? You don't want to add some fake variable that gets incremented each time through the loop, just so you can set a breakpoint that breaks on certain values of that variable. Instead you want to use the hit count property of the breakpoint. Just right click the red dot and choose Hit Count. There you can set the breakpoint to break whenever it's hit, just the 10th time it's hit, every tenth time (10, 20, 30 etc) or every time after the 10th time Or, of course, whatever number you want instead of 10:
Don't debug the slow way when there are tools to make you so much faster!
Filter 涓嬫鍐嶄粙緇?
娉ㄦ剰:c#鐨勪篃鍙互鐢ㄧ殑鍟?...
鏉ヨ嚜:http://www.gregcons.com/KateBlog/CategoryView.aspx?category=C%2B%2B
聽
cppunit:聽聽 http://morningspace.51.net/resource/cppunit/textui.html
聽
------------------------------------------------------------------------------------------------------------------------------------
Kamran Iqbal
Microsoft Corporation
閫傜敤浜庯細
Microsoft Visual Studio廬 2005 Team System
鎽樿錛?/b>鎻忚堪 Visual Studio 2005 Team System 鎻愪緵鐨勪唬鐮佸垎鏋愬拰鎬ц兘宸ュ叿銆?/p>
娉?/b> 鏈枃妗d簬浜у搧鎶曞叆鐢熶駭涔嬪墠緙栧啓錛屽洜姝ゆ偍鍙兘浼氬彂鐜拌繖閲屾墍鍖呭惈鐨勭粏鑺備笌鍙戝竷鐨勪駭鍝佹湁涓嶄竴鑷寸殑鍦版柟銆傛枃涓殑淇℃伅鍧囦緷鎹挵鍐欐湰鏂囨椂鐨勪駭鍝佺姸鍐碉紝浠呬緵鎮ㄥ湪瑙勫垝鏃跺弬鑰冦傚鏈夋洿鏀癸紝鎭曚笉鍙﹁閫氱煡銆侻icrosoft 鎷ユ湁鏈枃妗d腑鐨勪富棰樻墍娑夊強鐨勪笓鍒┿佷笓鍒╁簲鐢ㄧ▼搴忋佸晢鏍囥佺増鏉冩垨鍏朵粬鐨勭煡璇嗕駭鏉冦傞櫎闈?Microsoft 浠ヤ換浣曚功闈㈣鍙崗璁槑紜彁渚涳紝鍚戞偍鎻愪緵鏈枃妗e茍娌$粰浜堟偍浣跨敤榪欎簺涓撳埄銆佸晢鏍囥佺増鏉冩垨鍏朵粬鐭ヨ瘑浜ф潈鐨勪換浣曡鍙瘉銆?/p>
![]() |
綆浠?/a> |
![]() |
鍒嗘瀽宸ュ叿鏀寔 |
![]() |
鎴戜滑鐨勮В鍐蟲柟妗?/a> |
![]() |
Visual Studio 涓殑宸ュ叿闆嗘垚 |
![]() |
灝忕粨 |
瑕佸紑鍙戝仴澹屽彲闈犵殑杞歡錛屽紑鍙戜漢鍛橀渶瑕佷竴濂楅泦鎴愬垎鏋愬伐鍏鳳紝鏉ュ府鍔╀粬浠湪寮鍙戠殑鏃╂湡媯嫻嬩唬鐮佺己闄峰拰鎬ц兘闂銆?/p>
榪囧幓錛岀敱浜?Visual Studio 涓己灝戝浠g爜鍒嗘瀽鐨勬敮鎸侊紝鍥犳寮鍙戜漢鍛樹笉寰椾笉璐拱絎笁鏂瑰伐鍏鳳紝鏋勫緩鑷畾涔夊垎鏋愬伐鍏鳳紝鎴栬呭彂甯冩湭緇忓垎鏋愮殑浠g爜銆?
鈥?/td> |
鑺辮垂棰濆鐨勬垚鏈喘涔扮涓夋柟宸ュ叿銆? 浠庝紬澶氱殑鍒嗘瀽宸ュ叿涓夋嫨涓涓棦鑳芥弧瓚寵蔣浠跺垎鏋愮殑瑕佹眰鍙堝湪棰勭畻闄愬埗鑼冨洿涔嬪唴鐨勫伐鍏鳳紝鏈繀鎬繪槸涓欏硅交鏉劇殑浠誨姟銆傚彟澶栵紝榪欎簺宸ュ叿鍙兘娌℃湁闆嗘垚鍒?Visual Studio 闆嗘垚寮鍙戠幆澧?(IDE) 涓紝鍥犳閫氬父闇瑕佽姳璐歸澶栫殑鏃墮棿鏉ュ涔犲浣曢『鍒╁湴浣跨敤瀹冧滑銆? |
鈥?/td> |
鏋勫緩鑷畾涔夊垎鏋愬伐鍏楓? 鏋勫緩鑷畾涔夊垎鏋愬伐鍏烽渶瑕佽祫婧愩佹妧鑳藉拰緇忛獙銆傝繖瀵瑰ぇ澶氭暟鍏徃涓殑寮鍙戝洟闃熻岃█鏄笉鐜板疄鐨勶紝浠呬粎鏄皯鏁板叕鍙稿彲浠ユ媴璐熷緱璧風殑閫夋嫨銆? |
鈥?/td> |
鍙戝竷鏈粡鍒嗘瀽鐨勪唬鐮併? 鍦ㄥ伐鏃舵湡闄愬拰棰勭畻闄愬埗绱у紶鐨勬儏鍐典笅錛屽彂甯冩湭緇忓垎鏋愮殑浠g爜浼間箮鏄竴縐嶆紜殑鏂規硶錛屼絾濡傛灉杞歡鍦ㄩ儴緗蹭箣鍚庡彂鐢熸晠闅滐紝鍙兘璇佹槑閲囩敤榪欑閿欒鏂規硶鐨勪唬浠蜂笉鑿層? |
鍦?Visual Studio 2005 Team System 涓紝寮鍙戜漢鍛樺皢浼氱湅鍒頒竴濂楀叏鏂扮殑銆佸畬鍏ㄩ泦鎴愬埌 IDE 涓殑鍒嗘瀽宸ュ叿銆傝繖縐嶅垎鏋愬伐鍏蜂笌寮鍙戠幆澧冪殑绱у瘑闆嗘垚錛屽彲浠ュ府鍔╁紑鍙戜漢鍛樺湪浜у搧寮鍙戠殑鏃╂湡媯嫻嬪茍淇浠g爜緙洪櫡鍜屾ц兘闂銆傝繖榪樺彲浠ュ府鍔╁洟闃熸湁鏁堜笖楂樻晥鍦扮鐞嗚蔣浠跺紑鍙戠敓鍛藉懆鏈燂紙Software Development Life Cycle錛孲DLC錛夈?/p>
鍦?Visual Studio 2005 Team System 涓紝鏈変袱綾誨垎鏋愬伐鍏峰彲鐢ㄤ簬鏋勫緩鍋ュ.鑰屽彲闈犵殑杞歡錛?
鈥?/td> |
浠g爜鍒嗘瀽宸ュ叿 |
鈥?/td> |
鎬ц兘宸ュ叿 |
鍦ㄥ紑鍙戠幆澧冧腑闆嗘垚鍒嗘瀽宸ュ叿鍙互甯姪寮鍙戜漢鍛樻嫻嬩笌緙栫爜銆佹ц兘鍙婂畨鍏ㄦх浉鍏崇殑闂銆傛澶栵紝鍙皢浠g爜鍒嗘瀽宸ュ叿浣滀負絳懼叆絳栫暐鐨勪竴閮ㄥ垎鐢ㄤ簬姣忔棩鏋勫緩 (nightly build) 榪囩▼錛屼嬌寮鍙戝洟闃熻兘澶熷湪灝嗕唬鐮佺鍏ュ埌婧愭爲 (source tree) 涔嬪墠淇緙洪櫡銆傞氳繃鍦ㄥ紑鍙戠殑鏃╂湡錛堣屼笉鏄悗鏈燂級鏇存闂錛屽洟闃熷彲闄嶄綆淇浠g爜緙洪櫡鐨勬諱綋鎴愭湰銆?/p>
闄や簡瀹屽叏闆嗘垚鍒?IDE 涓箣澶栵紝寮鍙戜漢鍛樿繕鍙互浠庡懡浠よ浣跨敤榪欎簺宸ュ叿銆?/p>
鍦?Visual Studio 2005 Team System 涓紝閫氳繃浣跨敤浠g爜鍒嗘瀽宸ュ叿鍜屾ц兘宸ュ叿錛屽紑鍙戜漢鍛樺彲浠ュ浠g爜榪涜闈欐佸拰鍔ㄦ佸垎鏋愩?/p>
浠g爜鍒嗘瀽宸ュ叿
浠g爜鍒嗘瀽宸ュ叿鐨勭洰鏍囨槸浣垮紑鍙戜漢鍛樿兘澶熷鍏墮」鐩繘琛岄潤鎬佸垎鏋愶紝浠ユ嫻嬪拰淇浠g爜緙洪櫡銆備負浜嗗疄鐜拌繖涓洰鏍囷紝Visual Studio 2005 Team System 涓寘鍚簡涓や釜宸ュ叿錛?
鈥?/td> |
PREfast |
鈥?/td> |
FxCop |
PREfast
PREfast 鏄竴涓潤鎬佸垎鏋愬伐鍏鳳紝瀹冧負寮鍙戜漢鍛樻彁渚涙湁鍏沖叾 C/C++ 婧愪唬鐮佷腑鍙兘瀛樺湪緙洪櫡鐨勪俊鎭侾REfast 鎶ュ憡鐨勫父瑙佷唬鐮侀敊璇寘鎷紦鍐插尯婧㈠嚭銆佹湭鍒濆鍖栧唴瀛樸佺┖鎸囬拡鍙栨秷寮曠敤銆佸唴瀛樻硠婕忓拰璧勬簮鐭己銆?/p>
IDE 闆嗘垚
涓轟簡浣垮紑鍙戜漢鍛樿兘澶熻嚜鐒跺湴浣跨敤鍒嗘瀽宸ュ叿錛屽彲浠ュ皢 PREfast 瀹屽叏闆嗘垚鍒?IDE 涓傞氳繃鍦ㄩ」鐩殑 Property Pages 涓婇夋嫨 Yes (/prefast)錛屽紑鍙戜漢鍛樺彲浠ヨ交鏉懼惎鐢?PREfast錛屽鍥?1 鎵紺恒?/p>
鍥?/b> 1. 鍚敤 PRE f ast
鍦ㄧ敓鎴愯繃紼嬩腑錛屼負婧愪唬鐮佺敓鎴愮殑浠諱綍 PREfast 璀﹀憡閮藉嚭鐜板湪 Error List 涓傝繖浜涜鍛婂寘鎷己闄瘋礬寰勪俊鎭紙濡傛灉鏈夛級錛涘弻鍑葷獊鍑烘樉紺虹己闄瘋礬寰勭殑璀﹀憡錛屽彲浠ヨ繘鍏ヤ唬鐮佺紪杈戝櫒涓殑璀﹀憡錛屽鍥?2 鎵紺恒?/p>
鍥?/b> 2. PRE f ast 璀﹀憡
#pragma support
Developers can use the #pragma directive to treat warnings as errors, or disable warnings, as shown below. #pragma warning (error: 6260) //treat warning 6260 as an error #pragma warning (disable: 6011) //disable warning 6011
鎵規敞鏀寔
PREfast 榪樻敮鎸佹壒娉ㄤ互鏀瑰杽浠g爜鍒嗘瀽鐨勭簿紜с傛壒娉ㄦ彁渚涙湁鍏沖嚱鏁板弬鏁板拰榪斿洖綾誨瀷鐨勪箣鍓嶅拰涔嬪悗鏉′歡鐨勯檮鍔犱俊鎭?/p>
#include [SA_Post( MustCheck=SA_Yes )] double* CalcSquareRoot ( [SA_Pre( Null=SA_No )] double* source, unsigned int size )
鍦ㄤ笂闈㈢殑紺轟緥涓細
鈥?/td> |
[SA_Post ( MustCheck=SA_Yes)] 瑕佹眰璋冪敤鏂規鏌?CalcSquareRoot 鐨勮繑鍥炲? |
鈥?/td> |
[SA_Pre ( Null=SA_No)] 瑕佹眰璋冪敤鏂瑰皢闈炵┖鍙傛暟鈥渟ource鈥濅紶閫掔粰 CalcSquareRoot |
鍛戒護琛屾敮鎸?/em>
闄や簡涓庡紑鍙戠幆澧冨畬鍏ㄩ泦鎴愪箣澶栵紝寮鍙戜漢鍛樿繕鍙互浠庡懡浠よ浣跨敤 PREfast錛屽涓嬫墍紺恒?/p>
C:\>cl /prefast Sample.cpp
FxCop
FxCop 鏄竴涓潤鎬佸垎鏋愬伐鍏鳳紝瀹冨垎鏋愭墭綆′唬鐮佺▼搴忛泦騫舵姤鍛婃湁鍏崇▼搴忛泦鐨勪俊鎭紝渚嬪錛屼笌 Microsoft .NET Framework Design Guidelines 涓槓榪扮殑緙栫▼鍜岃璁¤鍒欑浉鍐茬獊銆侳xCop 琛ㄧず鍦ㄥ垎鏋愯繃紼嬩腑浣滀負瑙勫垯鎵ц鐨勬鏌ャ傝鍒欐槸涓孌墊墭綆′唬鐮侊紝璇ヤ唬鐮佸垎鏋愮▼搴忛泦騫惰繑鍥炴湁鍏沖畠鍙戠幇緇撴灉鐨勬秷鎭傝鍒欐秷鎭瘑鍒換浣曠浉鍏崇殑緙栫▼鍜岃璁¢棶棰橈紝騫跺湪鍙兘鐨勬儏鍐典笅錛屾彁渚涙湁鍏沖浣曚慨澶嶇洰鏍囩殑淇℃伅銆?/p>
IDE 闆嗘垚
涓轟簡浣垮紑鍙戜漢鍛樿兘澶熻嚜鐒跺湴浣跨敤鍒嗘瀽宸ュ叿錛屽紑鍙戜漢鍛樺彲浠ュ湪欏圭洰鐨?Property Pages 涓婇夋嫨 Run FxCop錛屽鍥?3 鎵紺恒?/p>
鍥?/b> 3. 鍚敤 FxCop
鏈夊叧鍖呭惈鎴栨帓闄よ鍒欙紝灝嗚鍒欎綔涓鴻鍛婃垨閿欒鐨勯檮鍔犻夐」錛屼篃鍙互鍦?Property Pages 涓壘鍒幫紝濡傚浘 4 鎵紺恒?/p>
鍥?/b> 4. FxCop 瑙勫垯
涓鏃﹀惎鐢?FxCop錛屽湪鐢熸垚榪囩▼涓紝FxCop 灝變細鍦?Error List 涓姤鍛婂啿紿侊紝濡傚浘 5 鎵紺恒?/p>
鍥?/b> 5. FxCop 瑙勫垯鍐茬獊
Error List 鎻愪緵鏈夊叧瑙勫垯鍐茬獊鐨勪俊鎭拰寤鴻錛屼互渚夸簬鎮ㄧ籂姝i敊璇傚彧闇鍦?Error List 涓弻鍑昏鍒欏啿紿侊紝鍗沖彲杞繪澗鍦板畾浣嶅埌瑙︾姱浜嗚鍒欑殑浠g爜琛屻?/p>
MSBuild 闆嗘垚
Visual Studio 鐨勪笅涓涓増鏈粠鏍規湰涓婃敼榪涗簡鐢熸垚榪囩▼錛屽叾鏂規硶鏄紩鍏ヤ竴涓柊鐨勩佸悕涓?MSBuild 鐨勭敓鎴愬紩鎿庛傚彲浠ラ氳繃 MSBuild 緋葷粺璋冪敤 FxCop銆傝繖浣垮紑鍙戜漢鍛樿兘澶熶粠鍛戒護琛岃繍琛屾墭綆¢」鐩笂鐨?FxCop銆?/p>
鎬ц兘宸ュ叿
鍦?Visual Studio 2005 Team System 涓紝寮鍙戜漢鍛樺彲浠ラ氳繃鎬ц兘宸ュ叿鏉ュ害閲忋佽綆楀拰瀹氫綅浠g爜涓笌鎬ц兘鐩稿叧鐨勯棶棰樸傝繖浜涘伐鍏烽兘瀹屽叏闆嗘垚鍒?IDE 涓紝浠ユ彁渚涙棤緙濄佸弸濂界殑鐢ㄦ埛浣撻獙銆?/p>
鎬ц兘宸ュ叿鏀寔涓ょ鍒嗘瀽鏂規硶錛?
鈥?/td> |
閲囨牱 |
鈥?/td> |
浣跨敤浠櫒 |
鍦ㄩ噰鏍風殑榪囩▼涓紝鏁版嵁鏀墮泦鍩虹緇撴瀯灝嗗畾鏈熶腑鏂鍦ㄦ墽琛岀殑搴旂敤紼嬪簭錛屼互紜畾姝e湪鎵ц鐨勬槸鍝釜鍑芥暟錛屽茍澧炲姞鍑芥暟鐨勯噰鏍瘋鏁般傚畠瀛樺偍鏈夊叧鍑嗗鍑芥暟璋冪敤鐨勮皟鐢ㄥ爢鏍堢殑淇℃伅銆?/p>
搴旂敤紼嬪簭閫鍑哄悗錛屾敹闆嗗埌鐨勬墍鏈夋暟鎹細鐢熸垚涓轟竴涓姤鍛婃枃浠訛紝鎮ㄥ彲浠ヤ嬌鐢?IDE 涓泦鎴愮殑鎶ュ憡鍔熻兘杞繪澗鍦版煡鐪嬭鏂囦歡銆?/p>
閲囨牱鐨勪紭鍔垮湪浜庝綆寮閿錛屽洜涓鴻繖鍙槸瀹氭湡涓柇搴旂敤紼嬪簭銆傝繖浣垮緱搴旂敤紼嬪簭鐨勮涓鴻兘澶熸洿鎺ヨ繎瀹為檯鎯呭喌銆傝繖縐嶆柟娉曠殑緙虹偣鏄紝瀹冨彧鑳借幏鍙栧凡閲囨牱鍑芥暟鐨勭浉鍏蟲ц兘鏁版嵁銆傛湁鍙兘娌℃湁瀵歸渶瑕侀噰鏍風殑鍑芥暟榪涜閲囨牱錛屽洜鑰屾棤娉曡幏鍙栨湁鍏寵鍑芥暟鐨勪俊鎭?
浣跨敤浠櫒鐨勪紭鍔垮湪浜庡彲浠ユ敹闆嗗簲鐢ㄧ▼搴忕殑鐗瑰畾閮ㄥ垎鐨勭簿紜ц兘鏁版嵁銆傚湪浣跨敤浠櫒鐨勮繃紼嬩腑錛屸渆nter鈥濆拰鈥渆xit鈥濇帰閽堣鎻掑叆鍒板簲鐢ㄧ▼搴忕殑鍑芥暟涓傝繖浜涙帰閽堝皢鎶ュ憡榪斿洖緇欐暟鎹敹闆嗗熀紜緇撴瀯錛屽茍鍏佽鐢ㄦ埛鎹曡幏鍑芥暟鎵ц鎵闇鐨勭簿紜椂闂達紙鎴栧叾浠栬 閲忔爣鍑嗭級銆?/p>
鍒嗘瀽搴旂敤紼嬪簭
鍒嗘瀽搴旂敤紼嬪簭鐨勯閫変嬌鐢ㄦā寮忔槸棣栧厛寮濮嬮噰鏍鳳紝鐒跺悗鏍規嵁閲囨牱鎵浜х敓鐨勭粨鏋滄嫻嬪簲鐢ㄧ▼搴忕殑鐗瑰畾鏂歸潰銆?/p>
鍒嗘瀽搴旂敤紼嬪簭鐨勮繃紼嬬浉褰撶畝鍗曘傞鍏堝垱寤轟竴涓柊鐨勬ц兘浼氳瘽銆傚湪 Visual Studio 2005 Team System 涓紝鍙互浣跨敤 Performance Session Wizard 鍒涘緩涓涓柊鐨勬ц兘浼氳瘽銆?/p>
Performance Session Wizard
Performance Session Wizard 璁劇疆鍒嗘瀽搴旂敤紼嬪簭鐨勫繀瑕佺幆澧冦傚湪 Visual Studio 2005 Team System 涓紝璇ュ悜瀵間負 EXE銆丏LL 鍜?ASP.NET 搴旂敤紼嬪簭鎻愪緵鍐呯疆鏀寔銆?/p>
鍙互浣跨敤璇ュ悜瀵煎垱寤轟竴涓?New Performance Session錛屽鍥?6 鎵紺恒?/p>
鍥?/b> 6. 鍚姩鎬ц兘鍚戝
娉?/b> 瑕佹墜鍔ㄥ垱寤轟竴涓柊鐨勬ц兘浼氳瘽錛岃浣跨敤鑿滃崟涓婄殑 New Performance Session 鍛戒護銆傚彲浠ラ噰鐢ㄨ繖縐嶆柟娉曟潵鎵嬪姩鍒嗘瀽鍏朵粬綾誨瀷鐨勫簲鐢ㄧ▼搴忥紙渚嬪錛學indows 鏈嶅姟錛夈?/p>
Performance Explorer
鎬ц兘浼氳瘽浣滀負榪愯浼氳瘽鍚戝鎴栨墜鍔ㄥ垱寤轟細璇濈殑緇撴灉鑰屽垱寤恒?b>Performance Explorer 鍙互灝嗗叾鐩磋鍦拌〃紺哄嚭鏉ワ紝濡傚浘 7 鎵紺恒?/p>
鍥?/b> 7. 鎬ц兘璧勬簮綆$悊鍣?/b>
Performance Explorer 緇欑敤鎴峰憟鐜頒簡灞傛緇撴瀯銆傝灞傛緇撴瀯鐨勬牴鑺傜偣琛ㄧず Performance Session銆傝繖縐嶈妭鐐圭殑灞炴ф槸鐢ㄦ埛鍦ㄥ垱寤?Performance Session 鏃惰緗殑灞炴с傚鏋滅敤鎴蜂嬌鐢?Performance Session Wizard 鍒涘緩浼氳瘽錛屽垯榪欎簺灞炴т綋鐜頒簡鐢ㄦ埛鍦ㄤ嬌鐢ㄥ悜瀵肩殑榪囩▼涓墍閫夋嫨鐨勫箋傚鏋滅敤鎴鋒墜鍔ㄥ垱寤?Performance Session錛屽垯榪欎簺灞炴у寘鍚簡瀹冧滑鐨勯粯璁ゅ箋?/p>
鏍硅妭鐐規湁涓や釜瀛愯妭鐐癸細Targets 鑺傜偣鍜?Reports 鑺傜偣銆?b>Targets 鑺傜偣鍖呭惈涓涓垨澶氫釜鐩爣錛岀洰鏍囧彲浠ユ槸 EXE銆丏LL 鎴?ASP.NET 搴旂敤紼嬪簭銆?/p>
Reports 鑺傜偣鍖呭惈涓庢煇涓壒瀹?Performance Session 鐩稿叧鐨勬墍鏈夋姤鍛娿?/p>
鎬ц兘浼氳瘽鎶ュ憡
涓鏃﹀簲鐢ㄧ▼搴忔墽琛屽畬姣曪紝緋葷粺灝變細灝嗕竴涓ц兘浼氳瘽鎶ュ憡鑷姩娣誨姞鍒?Reports 鑺傜偣銆傚彲浠ラ氳繃涓嬮潰鐨勮鍥炬潵鏌ョ湅榪欎簺鎶ュ憡錛?/p>
Summary 瑙嗗浘
Summary 瑙嗗浘涓哄紑鍙戜漢鍛樻彁渚涗簡鍏惰皟鏌ョ殑璧風偣銆傚畠鏄劇ず搴旂敤紼嬪簭鎵ц榪囩▼涓紑閿鏈楂樼殑鍑芥暟錛屽鍥?8 鎵紺恒備粠璇ヨ鍥句腑鐨勬瘡涓暟鎹偣錛岀敤鎴烽兘鍙互瀹氫綅鍒版洿璇︾粏鐨勮鍥俱?/p>
鍥?/b> 8. Summary 瑙嗗浘
Functions 瑙嗗浘
Functions 瑙嗗浘鏄劇ず鍦ㄥ簲鐢ㄧ▼搴忕殑鎵ц榪囩▼涓皟鐢ㄧ殑鍏ㄩ儴鍑芥暟錛岃繖浜涘嚱鏁板瓨鍦ㄤ簬鐢辮搴旂敤紼嬪簭寮曠敤鐨勬墍鏈夋ā鍧椾箣涓紝濡傚浘 9 鎵紺恒傝瑙嗗浘鏄劇ず鐨勪俊鎭彇鍐充簬鎵鐢ㄧ殑鍒嗘瀽鏂規硶錛堥噰鏍蜂笌浣跨敤浠櫒錛夈?/p>
鍥?9. Functions 瑙嗗浘
Caller/Callee 瑙嗗浘
Caller/Callee 瑙嗗浘鎻愪緵鍦?Functions 瑙嗗浘涓墍鍒楀嚱鏁扮殑璇︾粏淇℃伅錛屽鍥?10 鎵紺恒?/p>
鍥?/b> 10. Caller/Callee 瑙嗗浘
Callstack 瑙嗗浘
Callstack 瑙嗗浘浣跨敤鎴瘋兘澶熷悜涓嬫悳绱㈢壒瀹氱殑璋冪敤璺熻釜錛屽茍鍒嗘瀽鍝簺璺熻釜瀵規ц兘鐨勫獎鍝嶆渶澶с?/p>
鍥?/b> 11. Callstack 瑙嗗浘
Type 瑙嗗浘
Type 瑙嗗浘鎻愪緵鏈夊叧鏌愪釜鐗瑰畾綾誨瀷鐨勫疄渚嬫暟閲忓拰鎬誨瓧鑺傛暟鐨勪俊鎭紝濡傚浘 12 鎵紺恒?/p>
鍛戒護琛屾敮鎸?/em>
鍙互閫氳繃鍛戒護琛屽伐鍏蜂嬌鐢ㄦц兘宸ュ叿鍔熻兘銆傝繖涓虹敤鎴鋒彁渚涗簡鐏墊椿鎬э紝鐢ㄦ埛鏃㈠彲浠ヤ粠鍛戒護琛岃繍琛岃繖浜涘伐鍏鳳紝鍙堝彲浠ラ氳繃鑴氭湰鏉ヤ嬌鐢ㄥ畠浠紝浠ヤ究鑷姩鎵ц浠誨姟銆?/p>
榪欑瘒鏂囩珷鎻忚堪浜嗭細
鈥?/td> |
鍗曞厓嫻嬭瘯鐨勪俊浠?/p> |
鈥?/td> |
嫻嬭瘯姝g‘浜嬩歡 |
鈥?/td> |
鍒涘緩緇存姢嫻嬭瘯 |
鈥?/td> |
鍒涘緩鏄撹嫻嬭瘯 |
榪欎簺澶╂湁寰堝鐨勫叧浜庡崟鍏冩祴璇曠殑鍜屽湪涓嶅悓鐨勫満鏅笅涓轟粬浠殑搴旂敤紼嬪簭緙栧啓鍗曞厓嫻嬭瘯(璧峰浜? 鎴戜滑2005騫村叚鏈堢殑 MSDN廬Magazine 涓湁鍏蟲祴璇曚綘鐨勬暟鎹眰鐨勬枃绔? Know Thy Code: Simplify Data Layer Unit Testing using Enterprise Services)鐨勮璁恒傝繖浜涙剰鍛崇潃鏈夊緢澶氱殑寮鍙戣呰嚜璦鑷錛堟垨鑰呭浜庝粬浠殑鍥㈤槦錛夊埌錛氣滃搸錛屾垜浠篃闇瑕佸紑濮嬬紪鍐欐祴璇曚簡錛佲濆洜姝や粬浠紑濮嬬紪鍐欏崟鍏冩祴璇曚笂闈㈢殑鍗曞厓嫻嬭瘯鐩村埌浠栦滑杈懼埌浜嗕竴涓祴璇曡嚜宸卞凡緇忔垚涓洪棶棰樼殑紼嬪害銆傛垨璁哥淮鎶や粬浠槸涓涓お榪囧洶闅撅紝鑺辮垂澶暱鏃墮棿錛屾垨鑰呬粬浠茍娌℃湁瓚沖鐨勬槗璇繪т互渚夸簬鐞嗚В錛屾洿鎴栬呬粬浠湰韜瓨鍦╞ugs鏈変竴鐐規槸鑳藉浣垮緱鎴戜滑鐨勫紑鍙戜漢鍛樺彲浠ヤ笅瀹氬喅蹇冨幓鍋氱殑錛岄偅灝辨槸錛?鑺辮垂浠栦滑瀹濊吹鐨勬椂闂翠互鐢ㄦ潵鏀硅繘鎻愰珮浠栦滑鐨勬祴璇曟垨鑰呭拷鐣ュ叾涓殑闂, 浠庤屾湁鏁堢殑鐢╂帀閭d簺鑹拌嫤鐨勫伐浣溿傝岃繖浜涘洶闅劇殑鍘熷洜浠呬粎鏄洜涓洪偅浜涗笉鐔熺粌鐨勫啓鍏ュ崟鍏冩祴璇曘?鍦ㄨ繖綃囨枃绔犱腑錛屾垜灝嗕負澶у甯︽潵鍦ㄨ繃鍘諱竴騫村鏃墮棿閲屾垜鍦ㄥ紑鍙戯紝鎻愪緵鍜ㄨ鍜屽煿璁紑鍙戣呯瓑鏂歸潰鏈夋葷粨鍑烘潵鐨勪竴浜涙渶閲嶈鐨勭粌涔犲拰璇曢獙銆傝繖浜涘皬鐨勬妧宸у彲浠ュ府鍔╂偍鍐欏嚭鏇存湁鏁堢殑錛屽彲緇存姢錛屽拰椴佹鎬ф洿濂界殑鍗曞厓嫻嬭瘯銆傚悓鏃舵垜甯屾湜榪欎簺鎬葷粨鍜屽繝鍛婂彲浠ュ府鍔╂偍閬垮厤涓浜涚敱浜庨敊璇紩璧風殑澶ч噺鐨勬椂闂寸殑娑堣椼?/p>
![]() |
鍗曞厓嫻嬭瘯鐨勪俊浠?/font> |
![]() |
嫻嬭瘯姝g‘鐨勪簨鎯?/font> |
![]() |
鍒涘緩緇存姢嫻嬭瘯 |
![]() |
鍒涘緩鏄撹鎬ф祴璇?/font> |
![]() |
鍦ㄤ綘鐨勮緗柟娉曚腑閬垮厤閮ㄥ垎鐩稿叧鐨勪唬鐮?/font> |
![]() |
鎬葷粨 |
鍦ㄨ繖涓儴鍒嗭紝鎴戝皢鐣ヨ堪鍑轟竴浜涙渶閫氱敤鐨勪俊浠伙紝榪欎簺淇′換鏉ヨ嚜浜庡湪浣跨敤澶ч噺鍗曞厓嫻嬭瘯鑾峰緱鐨勫ソ澶勫拰瑙i噴涓轟粈涔堣繖浜涗俊浠婚氬父涓嶆槸蹇呴』鐪熷疄鐨勩傜劧鍚庢垜浠細甯姪鎮ㄥ湪鎮ㄧ殑宸ョ▼涓嫢鏈夎繖浜涗俊浠匯?/p>
鏇村姞綆鍗曠殑璺熻釜 Bug聽 褰撶劧榪欏茍涓嶆槸蹇呴』鐨勶紝閭d箞鎮ㄦ庝箞鐭ラ亾鎮ㄧ殑嫻嬭瘯鏄紜殑錛?鏄惁瀛樺湪鍦ㄤ竴浜涙祴璇曠幆鑺傛祴璇曞け璐ョ殑鎯呭喌錛熷彟澶栨偍鍙堝浣曠煡閬撴偍鐨勬祴璇曡鐩栦簡緋葷粺涓灝戠殑浠g爜閲忥紵鏄惁嫻嬭瘯鍒頒簡紼嬪簭涓殑閿欒錛岄敊璇張鍦ㄥ摢閲岀瓑絳夌殑闂銆?/p>
褰撲綘鍦ㄤ綘鐨勫崟鍏冩祴璇曚腑鍙戠幇浜哹ug鍚庡張浼氬彂鐢熶粈涔堜簨鎯呭摢錛熶綘浼氱獊鐒墮棿寰楀埌寰堝涓庢効鎰忛敊璇殑鍙嶉錛宐ug琚彂鐜幫紝浣嗘槸闂騫朵笉鍦ㄤ綘嫻嬭瘯鐨勪唬鐮佷腑銆備綘鐨勬祴璇曠殑閫昏緫瀛樺湪涓涓猙ug錛屽洜姝ゆ祴璇曞け璐ヤ簡銆傝繖浜沚ug涔熸槸鎮ㄦ渶闅捐媯鏌ュ嚭鏉ョ殑錛屽洜涓烘偍閫氬父浼氬幓媯鏌ユ偍鐨勫簲鐢ㄧ▼搴忚屼笉浼氬幓媯嫻嬩綘鐨勬祴璇曠幆鑺傘傚湪榪欓儴鍒嗕腑錛屾垜浼氬睍紺虹粰浣犲浣曠‘璁ゅぇ閲忕殑鍗曞厓嫻嬭瘯錛屼簨瀹炰笂灝辨槸浣垮緱璺熻釜bug鍙樺緱鏇村姞瀹規槗銆?/p>
浠g爜鏇村姞渚夸簬緇存姢聽浠庢渶緇堢偣鑰冭檻錛屼綘鍙互鍊懼悜浜庤涓鴻繖浜涗俊浠誨茍涓嶆槸蹇呴』鐨勶紝褰撶劧浣犳槸瀵圭殑錛岃鎴戜滑鍘昏錛屼唬鐮佷腑姣忎釜閫昏緫鏂規硶鑷沖皯瑕佹湁涓涓祴璇曟柟娉曪紙褰撶劧錛屼綘鍙兘鎷ユ湁涓涓互涓婄殑鏂規硶錛夊湪涓涓ソ鐨勬祴璇曡鐩栫殑宸ョ▼涓紝澶ф鏈夌櫨鍒嗕箣鍏崄鐨勪唬鐮佹槸鑳藉寰楀埌鍗曞厓嫻嬭瘯鐨勶紝鐜板湪涓嶅緱涓嶈冭檻鍒版祴璇曚篃鏄琚淮鎶ょ殑錛屽鏋滈拡瀵逛竴涓鏉傜殑閫昏緫鏂規硶浣犳湁20涓祴璇曪紝閭d箞褰撲綘鍚戣繖涓柟娉曟坊鍔犱竴涓弬鏁版椂浼氬彂鐢熶粈涔堜簨鎯呭摢錛熸祴璇曟棤娉曠紪璇戙傚綋浣犱慨鏀逛簡綾葷殑緇撴瀯鐨勬椂鍊欏悓鏍蜂細鍙戠敓榪欐牱鐨勪簨鎯呫傝繖鏃朵綘紿佺劧鍙戠幇涓轟簡鑳借浣犵殑搴旂敤紼嬪簭緇х畫宸ヤ綔浣犺嚜宸遍渶瑕佹敼鍙樺ぇ閲忕殑嫻嬭瘯銆傚綋鐒惰繖浼氳姳璐逛綘澶ч噺鐨勬椂闂淬?/p>
涓轟簡浣胯繖涓俊浠葷‘璁や笅鏉ワ紝浣犻渶瑕佺‘璁や綘鐨勬祴璇曟槸渚夸簬緇存姢鐨勩備繚鎸丏RY瑙勫垯鍐欏叆錛氫笉瑕侀噸澶嶄綘鑷繁銆傛垜浠皢鏇村姞鎺ヨ繎鐨勬潵鐪嬭繖涓棶棰樸?/p>
浠g爜鏇村姞瀹規槗琚悊瑙?/b>聽 鍗曞厓嫻嬭瘯鐨勫ソ澶勯氬父騫墮潪鏄漢浠渶鍒濇墍鏈熷緟鐨勶紝鍦ㄤ竴涓伐紼嬩腑鑰冭檻淇敼涓浜涗綘涔嬪墠浠庢病鏈夌湅榪囩殑浠g爜(姣旀柟璇?涓涓壒孌婄殑綾繪垨鑰呮柟娉?.浣犲皢濡備綍鍔ㄦ墜澶勭悊榪欎簺浠g爜錛熶綘鍙兘闇瑕佸湪欏圭洰涓幓嫻忚榪欎簺鐗瑰畾鐨勭被鎴栬呮柟娉曚嬌鐢ㄧ殑浠g爜錛岀悊鎵褰撶劧錛屽崟鍏冩祴璇曞氨鏄繖鏍蜂緥瀛愮殑涓涓緢濂界殑鍦烘墍銆傚悓鏃訛紝褰撴紜啓鍏ョ殑鏃跺欙紝鍗曞厓嫻嬭瘯鍙互涓哄伐紼嬫彁渚涗竴涓狝PI鏂囦歡鐨勫鏄撹鍙栫殑璁劇疆錛屼嬌寰楁枃妗g殑澶勭悊鍜屼唬鐮佺殑鐞嗚В瀵逛簬鏁翠釜鍥㈤槦涓殑鏂拌佸紑鍙戣呬竴鏍風殑綆鍗曪紝渚挎嵎銆傜劧鑰岋紝榪欎簺鍙兘鍦ㄦ祴璇曟槸鏄撹鐨勫拰瀹規槗鐞嗚В鐨勬儏鍐典笅鎵嶈兘琚‘璁わ紝榪欎釜瑙勫垯寰堝鐨勫崟鍏冩祴璇曞紑鍙戣呭茍涓嶄細閬靛驚銆傛垜灝嗚榪拌繖涓俊浠伙紝鐒跺悗鍦ㄨ繖綃囨枃绔犵殑鏄撹嫻嬭瘯鐨勯儴鍒嗙粰浣犲睍鐜板浣曞湪鍘誨啓鏄撹鐨勫崟鍏冩祴璇曘?/p>
嫻嬭瘯姝g‘鐨勪簨鎯?/h2>
鏂版潵鑰呭湪Test Driven Development (TDD)涓竴涓渶閫氬父鐨勯敊璇氨鏄粬浠氬父浼氭悶娣?Fail by testing something illogical."涓殑"Fail first"瑕佹眰銆備緥濡傦紝浣犲彲浠ョ敤涓嬮潰鐨勮鏍煎紑濮嬭繖涓柟娉曪細
' returns the sum of the two numbers Function Sum(ByVal a As Integer, ByVal b As Integer) As Integer
浣犲彲浠ュ悜濡備笅鐨勬柟寮忓啓涓涓け璐ユ祴璇曪細
<TestMethod()> _ Public Sub Sum_AddsOneAndTwo() Dim result As Integer = Sum(1, 2) Assert.AreEqual(4, result, "bad sum"); End Sub
鍒濈湅涓婂幓榪欎釜澶勭悊鍍忔槸涓涓啓澶辮觸嫻嬭瘯鐨勫ソ鐨勬柟娉曪紝瀹冨畬鍏ㄩ敊澶變簡浣犲啓閿欒嫻嬭瘯鐨勫垵濮嬬偣銆?/p>
涓涓け璐ユ祴璇曢獙璇佷簡鍦ㄤ唬鐮佷腑瀛樺湪涓浜涢敊璇紝褰撲綘鐨勬祴璇曞畬鎴愬悗榪欎釜嫻嬭瘯搴旇鏄氳繃鐨勶紝鐜板湪鐨勪緥瀛愪腑錛屾棤璁哄浣曪紝嫻嬭瘯閮藉皢浼氬け璐ワ紝鍗充嬌鏄唬鐮佸畬鎴愶紝鍥犱負嫻嬭瘯閫昏緫涓婁笉鏄紜殑銆傚鏋滃笇鏈涙祴璇曢氳繃嫻嬮渶瑕佹祴璇曡嚜韜繘琛屼慨鏀光曗曡屼笉鏄▼搴忕殑浠g爜鐨勬敼鍙橈紙褰撶▼搴忎唬鐮佹敼鍙樼殑鏃跺欙紝鏄痶est-first瑙勫垝鐨勬剰鍥撅級綆鐭潵璇達紝榪欎釜嫻嬭瘯涓嶄細鍙嶆槧鍑虹▼搴忎唬鐮佸畬鎴愬悗鐨勬渶緇堢殑緇撴灉錛屽洜姝よ繖涓笉鏄竴涓ソ鐨勬祴璇曘?/p>
TDD涓竴涓ソ鐨勬祴璇曡姹備綘鍘諱慨鏀逛唬鐮侊紝浠庤屼嬌瀹冭兘澶熸寜鐓ф兂瑕佺殑鏂瑰紡宸ヤ綔錛岃繖涓鐐硅鑳滀簬寮鴻揩浣犲幓鍙嶆槧鐜板湪鐨勭湡瀹炴儏鍐墊垨鑰呬竴涓潪閫昏緫瑕佹眰鐨勬復鏈涚殑緇撴灉銆備緥濡傦紝褰?錛?榪斿洖0鏃跺氨鎰忓懗鐫嫻嬭瘯澶辮觸銆傝繖涓畝鍗曠殑渚嬪瓙鍜岃繖縐嶆儏鍐墊槸鐩鎬技鐨勶紝鍦ㄧ粌涔犱腑錛屽鏋滅幇鍦ㄧ殑闇姹傛槸鍦ㄥ伐浣滅殑錛屾祴璇曞簲璇ュ彲浠ュ弽鏄犱綘鎵鏈熷緟鐨勭粨鏋滐紝鐒跺悗浣犲彲浠ヨ皟鏁寸幇鍦ㄤ唬鐮佺殑鎯呭喌鍘婚氳繃榪欎釜嫻嬭瘯銆?/p>
浣滀負涓涓鍒欙紝涓涓凡緇忚皟閫氱殑嫻嬭瘯涓嶅簲璇ヨ縐婚櫎鎺夛紝鍥犱負榪欎釜嫻嬭瘯鍦ㄧ淮鎶ゅ伐浣滀腑鍙互鐢ㄤ簬鎭㈠嫻嬭瘯銆備粬浠湪浣犳敼鍙樹唬鐮佹椂鐢ㄦ潵紜畾浣犳病鏈夋崯瀹沖埌鐜板湪宸茬粡宸ヤ綔鐨勫嚱鏁般傝繖灝辨槸涓轟粈涔堜綘涓嶅簲璇ヤ慨鏀歸偅浜涘凡緇忛氳繃鐨勬祴璇曪紝闄ら潪鏄竴浜涘緢灝忕殑淇敼錛屼緥濡傚鍔犲畠鐨勫彲璇繪э紙鎹㈠彞璇濊錛屽垎瑙f祴璇曪級
褰撲竴涓祴璇曢潪姝e父澶辮觸聽 鏈夋椂浣犲彲鑳介亣鍒板け璐ョ殑嫻嬭瘯錛岃岃繖鏃朵綘瀵逛唬鐮佺殑鏀瑰彉鏄畬鍏ㄥ悎鐞嗙殑銆傝繖閫氬父鏄洜涓轟綘閬囧埌浜嗗啿紿佺殑闇姹傘備竴鑸潵璇達紝鍙兘鏄竴涓柊鐨勯渶姹傦紙涓涓敼鍙樼殑鐗規э級涓庝竴涓棫鐨勫彲鑳藉凡緇忎笉鍐嶆湁鏁堢殑闇姹傚彂鐢熶簡鍐茬獊銆傝繖鏈変袱縐嶅彲鑳斤細
1. |
鍦ㄦ棫鐨勯渶姹傛垨鑰呮棤鏁堟垨鑰呭湪鍒嫻嬭瘯鐨勬儏鍐典笅鍒犻櫎琚獙璇佹湰璐ㄤ笂涓嶅啀鏈夋晥鐨勫け璐ョ殑嫻嬭瘯 |
2. |
鏀瑰彉鏃х殑嫻嬭瘯浣夸綘鍙互嫻嬭瘯鏂扮殑瑕佹眰錛堟湰璐ㄤ笂浣跨敤鏂扮殑嫻嬭瘯錛夛紝鐒跺悗鍦ㄦ柊鐨勮緗笅錛堟祴璇曠殑閫昏緫鐘舵佺浉鍚岋紝浣嗘槸鍒濆鍔熻兘鍑芥暟鍙兘鏈夋墍涓嶅悓錛夋祴璇曟棫鐨勯渶姹傘?/p> |
鑰屾湁鏃跺欎竴涓祴璇曞湪浣跨敤涓嶅畬鏁寸殑鎶鏈幓瀹屾垚浠誨姟鐨勬椂鍊欎篃鏄湁鏁堢殑錛屼緥濡傦紝浣犳湁涓涓垚鍛樼被甯︽湁涓涓狥OO鏂規硶錛屽畠琛ㄧ幇涓烘煇鍑犵琛屼負錛屽畠宸茬粡緇忕敱Test鍦╔騫村墠嫻嬭瘯瀹屾垚錛岀劧鍚庣幇鍦ㄤ竴浜涘叾浠栫殑闇姹傚姞浜嗚繘鏉ワ紝鏂規硶鐨勯昏緫澧炲己浜嗭紝浠庤屽彲浠ュ幓澶勭悊涓浜涚被浼間簬鍦ㄨ幏鍙栨暟鎹椂涓㈠け涓浜涘弬鏁扮殑寮傚父澶勭悊銆備絾榪欐椂錛岀獊鐒禩est X澶辮觸浜嗭紝铏界劧鍦ㄦ祴璇曡繖涓嚱鏁扮殑鏃跺欏彧鏄嬌鐢ㄤ簡鍚屾牱鐨勭被銆傝繖涓祴璇曠殑澶辮觸鏄洜涓哄湪璋冪敤鏂規硶涔嬪墠涓㈠け浜嗕竴浜涘垵濮嬪鐞嗘楠ゃ?/p>
榪欏茍涓嶆剰鍛崇潃浣犻渶瑕佺Щ闄est X錛屼綘灝嗕涪澶卞浜庝竴浜涢噸瑕佸姛鑳界殑嫻嬭瘯錛岃繖鏃朵綘搴旇鍘誨叧蹇冮偅浜涘垵濮嬪寲鏃剁殑闂錛岃屼笉鏄敼鍙樼被鐨勫垱寤轟互鐢ㄦ潵閫傚簲浣犳柊鐨勬剰鍥俱?/p>
褰撶劧濡傛灉浣犻偅閲屾湁200涓祴璇曢兘鏄洜涓烘棫鐨勭粨鏋勫鑷寸殑澶辮觸錛屼綘灝卞簲璇ユ壘鍒拌繖涓棶棰樻潵緇存姢浣犵殑嫻嬭瘯銆傝繖灝辨槸涓轟粈涔堜綘搴旇鎬繪槸縐婚櫎浣犳祴璇曚腑鐨勫壇鏈挨鍏舵槸鍦ㄧ敓浜т唬鐮佷腑銆?/p>
嫻嬭瘯瑕嗙洊鍜屾祴璇?/b> Angles聽 浣犲浣曠煡閬撴槸鍚︿綘鐨勬柊浠g爜鏄竴涓ソ鐨勮鐩栵紵褰撹瘯鍥劇Щ鍔ㄤ竴涓摼鎺ユ垨鑰呬竴涓害鏉熸鏌ュ悗錛屽鏋滄墍鏈夌殑嫻嬭瘯渚濈劧閫氳繃錛岄偅涔堜綘灝辨病鏈夎凍澶熺殑浠g爜澶嶅埗鐒跺悗浣犲彲鑳介渶瑕佹坊鍔犲叾浠栫殑嫻嬭瘯鍗曞厓銆?/p>
紜浣犳坊鍔犳紜祴璇曠殑鏈濂芥柟娉曞氨鏄祴璇曚竴浜涙渶騫沖父鐨勮鍜屾鏌ョ洿鍒扮敤闈炲父鐨勬墜孌典嬌瀹冨嚭閿欍傝繖涓篃璁稿緢闅撅紝浣嗘槸濡傛灉浣犱笉鑳借冭檻鍑轟竴涓浠g爜鍑洪敊鐨勬柟娉曪紝浣犲氨鍙兘娌℃湁濂界殑鐞嗙敱鍦ㄦ渶鍒濈殑鍦版柟鍐欎笅榪欒浠g爜銆?/p>
浣犱笉鐭ラ亾浠涔堟椂鍊欎笅涓涓紑鍙戣呬細璇曞浘榪愯浣犵殑紼嬪簭錛屼粬鍙兘浼樺寲鎴栬呴敊璇殑鍒犻櫎涓浜涘寘鍚湰璐ㄧ殑琛屻傚鏋滀綘娌℃湁涓涓祴璇曪紝瀹冨氨浼氬け璐ワ紝鍏朵粬鐨勫紑鍙戣呭彲鑳戒笉浼氱煡閬撲粬浠姱浜嗛敊璇?/p>
浣犱篃鍙兘璇曞浘鍒╃敤涓浜涘父閲忓幓鏇夸唬涓浜涘凡緇忛氳繃浜嗙殑嫻嬭瘯涓皟鐢ㄧ殑鍚勭鍚勬牱鐨勫弬鏁幫紝渚嬪錛岀湅涓嬮潰鐨勬柟娉曪細
Public Function Sum(ByVal x As Integer, ByVal y As Integer, _ ByVal allowNegatives As Boolean) As Integer If Not allowNegatives Then Throw New Exception() Return x + y End Function
浣犲彲浠ユ墦涔變唬鐮佸幓嫻嬭瘯瑕嗙洊錛岃繖鏈変竴浜涘叧浜庡浣曟祴璇曠殑鍙樺寲錛?/p>
' Try this... If Not True Then ' replace flag with const If x < 0 OrElse y < 0 Then Throw New Exception() End If ' Or this... If Not allowNegatives Then ' replace check with const If False OrElse y < 0 Then Throw New Exception() End If
濡傛灉鎵鏈夌殑嫻嬭瘯渚濈劧閫氳繃錛岄偅涔堜綘緙哄皯浜嗕竴涓祴璇曪紝鍙﹀涓涓孩鑹叉爣蹇楁槸鍦ㄤ綘涓哄縐嶇浉鍚屽兼祴璇曠殑媯鏌ャ傚涓嬶細
Assert.AreEqual(3, retval)
涓浜涙柟娉曠殑鍏崇郴鍙湅涓嬈★紙鍦ㄤ竴涓祴璇曚腑錛夋剰鍛崇潃浣犲彲浠ュ畨鍏ㄧ殑榪斿洖3浣滀負涓涓鹼紝鐒跺悗鎵鏈夌殑閽堝榪欎釜鏂規硶鐨勬祴璇曢兘灝嗛氳繃錛岃繖涓綋鐒舵剰鍛崇潃浣犱涪澶變簡涓涓祴璇曘傚鏋滀綘鍦ㄥ崟鍏冩祴璇曚腑媯鏌ヤ竴涓嬩唬鐮侊紝瀹冨氨寰堝鏄撹媯鏌ュ嚭鏉ャ?/p>
紜繚浣犵殑嫻嬭瘯鍐欑殑瓚婄畝鍗曡秺濂斤紝涓涓崟鍏冩祴璇曚竴鑸笉鍖呮嫭涓涓猧f switch鎴栬呭叾浠栦換浣曠殑閫昏緫澹版槑銆傚鏋滀綘鍙戠幇浣犺嚜宸卞湪浣犵殑嫻嬭瘯涓啓浜嗕竴浜涚被浼間簬閫昏緫澹版槑鐨勪笢瑗匡紝榪欐槸涓涓ソ鐨勬満浼氭潵嫻嬭瘯涓涓互涓婄殑浜嬩歡錛屽湪鍋氳繖鏍風殑鎿嶄綔鐨勬椂鍊欙紝浣犱細浣垮緱浣犵殑嫻嬭瘯姣旇鍜岀淮鎶ゆ洿鍔犵殑鍥伴毦錛屽湪鐢熶駭浠g爜涓悓鏍峰姝ゃ備繚鎸佷綘鐨勬祴璇曠畝鍗曪紝浣犲湪鐢熶駭浠g爜涓彂鐜癰ug瑕佽儨浜庡湪浣犵殑鍗曞厓嫻嬭瘯涓?/p>
浣挎祴璇曟槗浜庤繍琛?/b>聽 濡傛灉浣犵殑嫻嬭瘯騫朵笉瀹規槗榪愯錛岄偅涔堜漢浠笉浼氫俊浠誨畠銆備綘鐨勫簲鐢ㄧ▼搴忔渶鏈夊彲鑳芥湁涓嬮潰涓ょ綾誨瀷鐨勬祴璇曪細
鈥?/td> |
嫻嬭瘯鍦ㄦ病鏈変換浣曢厤緗殑鎯呭喌涓嬪鉤紼崇殑榪愯錛堣繖縐嶇被鍨嬬殑嫻嬭瘯錛屾垜浠彲浠ュ湪浠諱綍鐨勬満鍣ㄤ笂錛屽湪浠g爜鐨勬渶緇堢増涓婃垨鑰呭湪婧愭帶鍒朵笂嫻嬭瘯錛屽茍涓斿仛鍒版病鏈変換浣曟晠闅滅殑嫻嬭瘯錛?/p> |
鈥?/td> |
鍦ㄨ繍琛屽墠闇瑕佷竴浜涢厤緗? |
絎竴縐嶇被鍨嬫槸浣犲簲璇ユā浠跨殑錛岀浜岀綾誨瀷鏄綘閫氬父鍋氱殑錛屽挨鍏朵綘濡傛灉浣犳槸涓涓柊鐨勫崟鍏冩祴璇曘傚鏋滀綘鍙戠幇浣犺嚜宸辨祴璇曟椂鏈夊緢澶氱殑鐗規畩鐨勯渶姹傦紝鐜板湪鏄甯哥殑錛屼絾鏄噸瑕佺殑涓鐐瑰氨鏄綘瑕侀殧紱誨嚭涓や釜緇勮浠栦滑鑳藉鍗曠嫭鐨勫幓鍋氭祴璇曘?/p>
鎴戜滑鐨勬兂娉曟槸浠繪剰涓涓紑鍙戣呴兘搴旇鏈夎兘鍔涗慨鏀瑰拰榪愯涓浜涗笉闇瑕佽緗壒孌婄殑閰嶇疆鐨勬祴璇曡繘琛屾祴璇曘傚鏋滆繖鏈変竴浜涙祴璇曢渶瑕佸湪榪愯鍓嶆湁鐗規畩鐨勫叧娉紝寮鍙戣呭簲璇ョ煡閬撲粬浠紝鐒跺悗浠栧彲浠ヨ姳涓浜涙椂闂村涔犺繖浜涙祴璇曠殑鏂規硶銆傚洜涓哄緢澶氱殑寮鍙戣呮瘮杈冪殑鎳掞紙褰撶劧錛屼笉鏄綘錛夛紝浣犲彲浠ヨ鎯籌紝浠栦滑涓嶄細鍘誨仛閭d簺鐗規畩鐨勮緗紝鐩稿弽錛屼粬浠細璁╂祴璇曞け璐ュ洜涓轟粬浠湁鏇村ソ鐨勪簨鎯呭幓鍋氥?/p>
褰撶敤鎴瘋嫻嬭瘯澶辮觸鏃訛紝浠栦滑寮濮嬭冭檻浠栦滑涓嶈兘澶熶俊浠昏繖浜涙祴璇曚簡銆傚緢闅捐鏄惁嫻嬭瘯鍙互鍦ㄤ竴涓腑鎵懼埌涓涓寮忕殑bug鎴栬呭彧鏄竴涓敊璇殑瀹氫綅銆傚紑鍙戣呭彲鑳戒笉鏄庣櫧涓轟粈涔堟祴璇曡呬細鍦ㄤ竴寮濮嬪氨鎵ц澶辮觸銆備竴鏃︿粬浠笉鍐嶄俊浠諱綘鐨勬祴璇曪紝寮鍙戣呭皢浼氬仠姝㈣繍琛屽畠浠紝閭d箞bug灝變細椹葷暀鍦ㄧ▼搴忎腑錛屼箣鍚庝竴榪炰覆鐨勯夯鐑﹀氨鏉ヤ簡銆傘傘?/p>
涓轟簡閬垮厤榪欎歡浜嬫儏錛岀‘璁や綘鎬繪槸鏈変竴涓粍鍑嗗濂戒簡鍘繪祴璇曪紝嫻嬭瘯紼嬪簭鍒欐槸鍙互瀹夊叏榪愯錛屽彲淇′換鐨勩傛妸閭d簺灞炰簬閰嶇疆鎸戞垬緇勭殑嫻嬭瘯鏀懼埌涓嶅悓鐨勬枃浠跺す錛屾爲鎴栬呭伐紼嬩腑錛屽悓鏃舵爣璁扮壒孌婄殑璇存槑鎸囨槑浠栦滑鍦ㄨ繍琛屽墠闇瑕佸仛浠涔堛傚畬鎴愯繖浜涘悗錛屽紑鍙戣呭彲浠ヤ笉鎶曞叆鏃墮棿鍘婚厤緗氨寮濮嬫祴璇曞伐浣溿傚綋浠栦滑鏈夋椂闂村拰闇瑕佹椂錛屼粬浠篃鍙互閰嶇疆錛岃繍琛屾洿澶氱殑嫻嬭瘯鐜妭銆?/b>
鎴戜滑搴旇璇曠潃閬垮厤嫻嬭瘯縐佹湁鎴栦繚鎶ゆ垚鍛樸傝繖綃囨枃绔犱篃璁歌兘澶熷府鍔╀竴浜涗漢瑙e喅涓閮ㄥ垎闂錛屼絾鏄垜寰堝潥鍐崇浉淇$櫨鍒嗕箣涔濆崄涔濈殑鏃墮棿錛屼綘鍙互鍏ㄩ潰鐨勬祴璇曚竴涓被錛岄氳繃緙栧啓涓浜涗笌瀹冪殑鐙珛鍏叡鎺ュ彛鐩稿弽鐨勫崟鍏冩祴璇曘傛祴璇曠鏈夋垚鍛樺彲浠ヤ嬌浣犵殑嫻嬭瘯鏇村姞鑴嗗急錛屽鏋滆繖涓渶瑕佽嫻嬭瘯鐨勭被鐨勪竴浜涘唴鍦ㄦ柟闈㈢暐鏈夋敼鍔ㄧ殑璇濄備綘搴旇浣跨敤閫氳繃璋冪敤涓浜涗唬鐮侀噷鍒鐨勫叕鍏卞姛鑳借繖涓鏂規硶鍘繪祴璇曠鏈夊姛鑳姐傚綋浣犱緷鐒惰兘澶熺‘瀹氬叏閮ㄥ姛鑳藉茍娌℃湁鏀瑰彉鐨勬椂鍊欙紝浠呬粎嫻嬭瘯鍏叡鎴愬憳浼氬鑷存祴璇曢伃鍙楀父閲忎唬鐮佺殑鍥犲紡鍒嗚В浠ュ強鍐呴儴鐨勬墽琛屾儏鍐墊敼鍙樸?/p>
鍦ㄥ彲鑳界殑鏃跺欙紝搴旇閲嶆柊浣跨敤浣犵殑鍒涢犵墿錛屽鐞嗚繃紼嬶紝鍜屽0鏄庝唬鐮併備笉瑕佸湪涓涓崟鍏冩祴璇曚腑鐩存帴鐨勫垱寤虹被鐨勫疄渚嬨傚鏋滀綘鍦ㄤ換浣曞茍涓嶅寘鍚湪姝ゅ崟鍏冩祴璇曟鏋朵腑鐨勭被鍓嶉潰鐪嬪埌榪欎釜鍗曡瘝鈥?/b>new鈥濓紝浣犲簲璇ヨ冭檻涓涓嬪皢浣犲垱閫犵殑浠g爜鏀懼湪涓涓壒孌婄殑鏁翠綋鏂規硶涔嬩腑錛屽畠鍙互涓轟綘鍒涘緩涓涓璞″疄渚嬨備綘鍙互鍒版椂鍐嶉噸鏂頒嬌鐢ㄨ繖涓柟娉曟潵鑾峰緱浣犵殑嫻嬭瘯鍦ㄥ叾浠栨祴璇曚箣涓殑鏈鏂板疄渚嬨傝繖鏍峰彲浠ュ府鍔╀綘鏉ヤ繚鎸佽繖涓祴璇曠淮鎶ゆ墍闇鐨勬椂闂達紝鐒跺悗鍦ㄦ祴璇曡繘琛岀殑鏃跺欙紝浠庡浠g爜鏃犳硶棰勬枡鐨勬敼鍙樹箣涓繚鎶や綘鐨勬祴璇曘備綔涓轟竴涓緥瀛愶紝Figure聽1灞曠ず浜嗕竴瀵圭畝鍗曠殑嫻嬭瘯錛屽畠浣跨敤浜嗕竴涓狢alc綾匯?/p>
鍋囪浣犳湁20錛屾垨鑰呬綘鐢氳嚦鏈?00錛屼笌Calc綾誨仛鐩稿弽嫻嬭瘯錛屾墍鏈夎繖浜涚湅璧鋒潵浠や漢鍚冩儕鐨勭浉浼箋傜幇鍦ㄤ竴涓鍒掔殑鏀瑰彉榪嬌浣犱笉寰椾笉鍒犻櫎榛樿鐨凜alc鏋勯犲櫒騫朵笖浣跨敤涓涓惈鏈変竴浜涘弬鏁扮殑涓嶅悓鐨勬瀯閫犲櫒銆傞┈涓婏紝浣犳墍鏈夌殑嫻嬭瘯灝辮鏆傚仠浜嗐備綘鍙兘鍙互寰堣交鏄撶殑鍙戠幇闂鐨勫叧閿茍淇瀹冿紝浣嗕綘涔熷彲鑳藉仛涓嶅埌銆傛渶涓昏鐨勯棶棰樻槸浣犲皢浼氭氮璐瑰緢澶氬疂璐墊椂闂村湪淇悊浣犵殑嫻嬭瘯涓婇潰銆傚鏋滀綘鍦ㄤ綘鐨勬祴璇曠被涔嬩腑浣跨敤涓涓暣浣撶殑鏂規硶鍘誨垱寤篊alc 瀹炰緥錛屽氨鍍?a target="_blank">Figure聽2鎵鏄劇ず鐨勯偅鏍鳳紝榪欎簺灝卞茍涓嶆槸涓棶棰樸?/p>
鎴戝凡緇忓嫻嬭瘯鍋氫簡涓浜涙敼鍙樺凡浣垮畠浠兘澶熷叿鏈夋洿澶氬彲緇存姢鎬с傞鍏堬紝鎴戝皢鏂板垱寤虹殑浠g爜榪佺Щ鑷沖彲浠ュ啀搴︿嬌鐢ㄧ殑鏁翠綋鏂規硶涔嬩腑銆傝繖灝辨剰鍛崇潃鎴戝彧闇浠呬粎鏀瑰彉涓涓畝鍗曠殑鏂規硶浠ヤ嬌寰楀湪榪欎釜嫻嬭瘯綾諱腑鐨勬墍鏈夋祴璇曞湪涓涓柊鐨勬瀯閫犲櫒涓殑鑳藉姝e父鐨勫伐浣溿傚彟澶栦竴涓負鍒涢犻棶棰樿岃鐨勭畝鍗曡В鍐蟲柟娉曟槸鎶婂垱浣滅墿榪佺Щ鍒版祴璇曠被鐨?lt;TestInitialize()>鏂規硶涔嬩腑銆備笉騫歌繍鐨勬槸錛岃繖涓兘澶熷緢濂界殑宸ヤ綔浠呬粎鍦ㄤ綘閲嶆柊浣跨敤涓涓璞″茍鍦ㄤ竴浜涙祴璇曚腑鎶婂畠褰撲綔涓涓眬閮ㄧ被鍙橀噺銆傚鏋滀綘浠呬粎涓轟竴浜涙祴璇曚嬌鐢ㄥ畠錛堥儴鍒嗙浉鍏蟲垚鍛橈級錛屼綘鍊掍笉濡傚湪嫻嬭瘯涓皢瀹冧滑瀹炰緥鍖栵紝騫朵笖浣垮畠浠洿鍏鋒槗璇繪с?/p>
欏轟究涓鎻愮殑鏄紝璇鋒敞鎰忥紝鎴戝凡緇忓皢鏂規硶鍛藉悕涓篎actory_CreateDefaultCalc 銆傛垜寰堝枩嬈㈠皢鎴戞祴璇曚腑鐨勪換浣曞府鍔╂柟娉曠敤鐗規畩鐨勫墠緙鏉ュ懡鍚嶏紝榪欐牱鎴戝氨鑳藉緢杞繪槗鐨勬帉鎻″畠鏄仛浠涔堢敤鐨勩傝繖鏍峰鏄撹鎬т篃鏄潪甯告湁甯姪鐨勩?/p>
鎴戠殑絎簩涓敼鍙樻槸閲嶆柊浣跨敤嫻嬭瘯涓殑澹版槑浠g爜錛屽茍灝嗚繖孌典唬鐮佽縼縐誨埌涓涓‘璁ゆ柟娉曚箣涓傛墍璋撶‘璁ゆ柟娉曟槸浣犳祴璇曚腑鐨勪竴涓彲鍐嶅害浣跨敤鐨勬柟娉曪紝 榪欎釜鏂規硶鍖呭惈浜嗕竴涓0鏄庤鍙ヤ絾鏄畠鍙互鎺ュ彈涓嶅悓杈撳叆鍜屽湪杈撳叆鐨勫熀紜涓婅繘琛屾牎楠屻傚綋浣犲湪涓嶅悓杈撳叆鎴栬呬笉鍚岀殑鍒濆鐘舵佷笅涓嬈″張涓嬈$殑澹版槑鍚屼竴浜嬬墿鏃訛紝浣犲彲浠ヤ嬌鐢ㄧ‘璁ゆ柟娉曘傝繖涓鏂規硶鐨勪紭鐐規槸鏃嬌鍦ㄤ竴涓笉鍚岀殑鏂規硶閲岄潰澹版槑錛屽鏋滆繖涓0鏄庡け璐ヤ簡浣犲皢鍙互緇х畫淇濇湁涓涓紓甯稿鐞嗭紝鑰屼笖鍘熷璋冪敤嫻嬭瘯灝嗕細鏄劇ず鍦ㄦ祴璇曞け璐ヨ緭鍑虹獥鍙d箣涓?/p>
鎴戜篃鍦–alc 涓紶閫掑疄渚嬭屼笉鏄嬌鐢ㄤ竴涓眬閮ㄥ彉閲忥紝鍥犳鎴戠煡閬撴垜緇忓父浼犻掍竴涓疄渚嬶紝鑰屼笖榪欎釜瀹炰緥鏄皟鐢ㄦ祴璇曞皢鍏跺垵濮嬪寲鐨勩傚綋浣犳兂瑕佹敼鍙樺璞$姸鎬佹椂浣犲彲鑳芥兂瑕佸仛鍚屾牱鐨勪簨鎯咃紝涓句釜渚嬪瓙鏉ヨ錛屽綋鍦ㄦ祴璇曚笅鎴栬呭湪灝嗕細浼犻掔粰嫻嬭瘯鐨勫璞′笅閰嶇疆鐗規畩瀵硅薄鏃訛紝鍙互浣跨敤鐗規畩鐨凜onfigure_XX鏂規硶銆傝繖浜涙柟娉曞簲璇ヨ兘澶熻В閲婁粬浠厤緗竴涓璞″皢浼氱敤鏉ュ仛浠涔堢敤銆?a target="_blank">Figure聽3涔嬩腑鐨勪唬鐮佸氨鏄互涓婃柟娉曠殑瀹炰緥銆?/p>
榪欎釜嫻嬭瘯鎷ユ湁寰堝璁劇疆浠g爜鍙互鐢ㄦ潵澶勭悊鍚戞敞鍐岀鐞嗗櫒瀵硅薄涓坊鍔犲垵濮嬬姸鎬侊紝瀹冩槸榪欎釜嫻嬭瘯綾諱箣涓殑鎴愬憳銆傚湪姝ょ殑紜篃鏈変竴浜涢噸澶嶃?a target="_blank">Figure聽4鏄劇ず浜嗗湪鍒濆浠g爜涔嬪榪欎簺浜嬩緥鍦ㄥ洜寮忓垎瑙d箣鍚庡皢浼氬浣曞彉鍖栥?/p>
淇嫻嬭瘯鍏鋒湁闈炲父楂樼殑鍙鎬у拰紼沖畾鎬с備粎浠呴渶瑕佹敞鎰忕殑鏄笉瑕侀偅涔堢殑refactor浣犵殑嫻嬭瘯錛屼粬浠彲鑳戒細浠ヤ竴涓崟涓鐨勶紝涓嶅彲璇葷殑浠g爜琛屼綔涓虹粨鏉熴傚簲璇ユ敞鎰忕殑鏄垜鍦ㄨ繖閲屽彲鑳戒緷鐒朵嬌鐢ㄤ竴涓猇erify_XX 鏂規硶錛屼絾鏄繖騫朵笉鏄垜鐪熸瑕佸湪榪欓噷鍔犱互璇存槑鐨勩?/p>
娑堥櫎嫻嬭瘯涔嬮棿鐨勪緷璧栧叧緋?/b>
涓涓祴璇曞簲璇ヨ兘澶熻嚜鎴戠嫭绔嬨傚畠涓嶅簲璇ヤ笌鍏朵粬嫻嬭瘯鐩稿叧鑱旓紝涔熶笉搴旇渚濊禆浠諱綍鍏鋒湁鐗規畩榪愯欏哄簭鐨勬祴璇曪紝瀹冨簲璇ヨ兘澶熻幏寰椾綘鎵鍐欑殑鎵鏈夋祴璇曪紝鍙互闅忔剰榪愯鎵鏈夋祴璇曟垨鑰呭彧榪愯鍏朵腑鐨勪竴閮ㄥ垎錛屽茍涓旀槸浠ヤ換浣曢『搴忥紝鑰屼笖瑕佽兘澶熺‘淇濆畠浠棤璁烘庢牱閮藉簲璇ユ紜殑榪愯銆傚鏋滀綘涓嶈兘澶熸墽琛岃繖涓鍒欙紝浣犲皢浼氬彧鍦ㄦ煇縐嶇壒孌婄殑鎯呭喌涓嬫寜鐓ч鏈熺殑琛ㄧ幇鏉ヨ繍琛岀殑鐘跺喌涓嬬粨鏉熶綘鐨勬祴璇曘傝繖鏍峰瓙鐨勮瘽錛屽綋浣犲湪鏈緇堟湡闄愪笅涓庢鍚屾椂浣犺繕鎯崇‘瀹氫綘娌℃湁鍚戠郴緇熶箣涓紩榪涙柊鐨勯棶棰樼殑鏃跺欙紝褰撶劧灝變細鍑虹幇闂銆備綘鍙兘寰堝洶鎯戣屼笖鑰冭檻鐫鏄笉鏄綘鐨勪唬鐮佸嚭鐜伴棶棰橈紝榪欐椂錛屽湪浜嬪疄涓婏紝闂鍏跺疄浠呬粎鏄綘鐨勬祴璇曡繍琛岄『搴忔墍寮曡搗鐨勩傚洜姝わ紝浣犲彲鑳藉紑濮嬮敊榪囦簡涓浜涘湪嫻嬭瘯涓け璐ョ殑緇撴灉鑰屼笖浣垮畠瓚婂啓瓚婂皯銆傝繖灝嗕細鏄釜闀挎湡鐨勮繃紼嬨?/p>
濡傛灉浣犱粠涓涓祴璇曡皟鍑鴻嚦鍙︿竴涓祴璇曚箣涓紝浣犲簲璇ュ湪瀹冧滑涔嬮棿鍒涘緩涓涓粠灞炲叧緋匯備綘鏈川涓婅鏄湪涓涓祴璇曚腑嫻嬭瘯涓や釜浜嬬墿錛堟垜灝嗕細鍦ㄤ笅涓绔犱腑瑙i噴涓轟粈涔堣繖浼氭垚涓轟竴涓棶棰橈級銆傚氨鍙︿竴鏂歸潰鏉ヨ錛屽鏋滀綘鏈夋祴璇旴錛屽畠涓庢祴璇旳 鎵浜х敓鐨勭姸鎬佹槸涓嶇浉鍏崇殑錛岄偅涔堜綘浼氶櫡鍏モ滈『搴忊濋櫡闃變箣涓傚鏋滀綘鎴栬呭叾浠栦漢鎯寵鏀瑰彉嫻嬭瘯A錛屾祴璇旴灝嗕細鏆傚仠鑰屼笖浣犱笉鐭ュ畠鏆傚仠鐨勫師鍥犮傚榪欎簺鏁呴殰榪涜鏁呴殰澶勭悊浼氭氮璐瑰緢澶氭椂闂淬?/p>
浣跨敤<TestInitialize()> 鍜?lt;TestCleanup()>鏂規硶鏄湰璐ㄤ笂鑳藉鑾峰緱鏇村ソ鐨勬祴璇曢殧紱匯傜‘瀹氫綘鐨勬祴璇曟暟鎹椂鍒繪槸鏈鏂扮殑錛岃屼笖嫻嬭瘯涓嬪璞$殑涔熷叿鏈夋柊鐨勫疄渚嬶紝鑰屼笖鎵鏈夌殑鐘舵佸彲浠ユ彁鍓嶉鐭ワ紝鑰屼笖鏃犺浣犵殑嫻嬭瘯鍦ㄤ換浣曞湴鏂規垨鑰呬換浣曟椂闂磋榪愯錛岃繍琛岀殑鎯呭喌閮芥槸鐩稿悓鐨勩?/p>
鍦ㄤ竴涓崟鐙崟鍏冩祴璇曚腑閬垮厤澶氶噸澹版槑
鎴戜滑灝嗗0鏄庢晠闅滅湅浣滀竴涓▼搴忓紛鐥呯殑璞″緛涓斿0鏄庤褰撲綔杞歡浣撶殑鎸囩ず鐐規垨鑰呪滆娑叉鏌モ濄備綘鍙互鎵懼埌瓚婂鐨勭棁鐘訛紝紼嬪簭寮婄梾灝辮秺鍙互杞繪澗鐨勮璇婃柇鍜屾帓闄ゆ帀銆傚鏋滀綘鍦ㄤ竴涓祴璇曚腑瀹氫箟浜嗗閲嶅0鏄庯紝鍙湁絎竴涓晠闅滃0鏄庡皢浼氫互鎶涘嚭寮傚父鐨勬柟寮忔樉紺哄嚭鏉ャ傝鍙傝冧笅闈㈡彃鍥句箣涓殑嫻嬭瘯浠g爜錛?/p>
<TestMethod()> _ Public Sub Sum_AnyParamBiggerThan1000IsNotSummed() Assert.AreEqual(3, Sum(1001, 1, 2) Assert.AreEqual(3, Sum(1, 1001, 2) ' Assert fails Assert.AreEqual(3, Sum(1, 2, 1001) ' This line never executes End Sub
浣犲彲鑳芥病鏈夊彂鐜頒互涓婁唬鐮佷箣涓叾浠栧彲鑳界殑寰佸厗銆傚湪涓涓晠闅滀箣鍚庯紝騫跺彂鐨勫0鏄庝笉浼氳鎵ц銆傝繖浜涗笉鑳界敓鏁堢殑澹版槑鍙兘鎻愪緵浜嗘湁浠峰肩殑鏁版嵁錛堟垨鑰呭緛鍏嗭級鍙兘鑳藉甯姪浣犲緢蹇殑闆嗕腑鐨勭劍鐐硅屼笖鍙戠幇娼滃湪鐨勯棶棰樸傚洜姝ゅ湪涓涓嫭绔嬬殑嫻嬭瘯涓繍琛屽閲嶅0鏄庡鍔犱簡鍏鋒湁寰堝皯浠峰煎鏉傛с傚彟澶栵紝澹版槑搴旇琚嫭绔嬬殑榪愯錛屾垜浠簲璇ヨ緗嚜鎴戠嫭绔嬬殑鍗曞厓嫻嬭瘯浠ヤ嬌寰椾綘鍏鋒湁鑳藉寰堝ソ鐨勫彂鐜伴敊璇殑鏈轟細銆?/b>
濡傛灉浣犱互鍓嶅啓榪囧崟鍏冩祴璇曪紝浣犳槸鍚﹀湪鍗曞厓嫻嬭瘯涓婂啓浜嗕竴涓ソ鐨勫0鏄庤錛熷彲璁鎬笉鏄繖鏍風殑錛屽ぇ澶氭暟寮鍙戣呭茍涓嶅帉鐑﹀幓鍐欎竴涓ソ鐨勫0鏄庡洜涓轟粬浠洿鍔犲叧蹇冨幓鍐欐祴璇曘?/p>
鍋囪浣犳槸鍥㈤槦涓殑涓涓柊鐨勫紑鍙戣咃紝浣犺瘯鍥捐涓涓崟鍏冩祴璇曘傝繛鎺ヨ繖涓細
<TestMethod()> _ Public Sub TestCalcParseNegative() Dim c As New Calc Assert.AreEqual(1000, c.Parse("-1, -1000") End Sub
浣滀負涓涓畝鍗曠殑緇冧範錛屽鏋滀綘鐞嗚В浜嗕笂渚嬩腑Calc鍒嗗垪鏂規硶鐨勭敤娉曪紝浣犲緢鍙兘鍙互榪涜寰堝ソ鐨勬帹嫻嬶紝浣嗘槸浠栧彲浠ョ畝鍗曠殑浣滀負浜哄憳鏁伴噺鐨勭敤渚嬩嬌寰楄緭鍑虹粨鏋滀負1000:
鈥?/td> |
鍦ㄧ粍涓繑鍥炴渶澶х殑璐熸暟浣滀負涓涓鏁般?/p> |
鈥?/td> |
濡傛灉鏁板瓧鏄礋鏁頒笖榪斿洖鍊間負鍓╀笅鍑犱釜鏁扮殑鎬誨拰浣滀負涓涓鏁幫紝閭d箞蹇界暐絎竴涓暟瀛椼?/p> |
鈥?/td> |
榪斿洖鐩鎬簰浣滀箻縐繍綆楄屽緱鐨勬暟瀛椼?/p> |
鐜板湪璇峰弬鑰冧笅闈㈠湪鍗曞厓嫻嬭瘯涔嬩腑鐨勫皬鏀瑰姩錛?/p>
<TestMethod()> _ Public Sub Parse_NegativeFirstNum_ReturnsSumOfTheRestAsPositive() Dim c As New Calc Dim parsedSumResult As Integer = c.Parse("-1", "-1000") Const SUM_WITH_IGNORED_FIRST_NUM As Integer = 1000 Assert.AreEqual(SUM_WITH_IGNORED_FIRST_NUM, parsedSumResult) End Sub
榪欎釜鏄笉鏄瘮杈冨鏄撶悊瑙e憿錛熷綋澹版槑娑堟伅娑堝け涔嬪悗錛岃〃杈炬剰鍥炬渶鍚堥傜殑鍦版柟灝辨槸嫻嬭瘯鐨勫悕瀛椼?/b> 濡傛灉浣犲箍娉涚殑浣跨敤浜嗗畠錛屼綘灝嗕細鍙戠幇浣犱笉鍐嶉渶瑕佽嫻嬭瘯浠g爜灝辮兘鏄庣櫧浠g爜嫻嬭瘯鐨勭洰鐨勬墍鍦ㄣ備簨瀹炰笂錛屼綘緇忓父鏍規湰涓嶉渶瑕佸啓浠諱綍娉ㄩ噴錛屽洜涓轟唬鐮侊紝鐗瑰埆鏄偅浜涘甫鐫瀹炰緥鐨勶紝浠栦滑鑷繁鏄瘉鏄庤嚜宸辯殑銆?/p>
鍚嶅瓧鍖呭惈浜嗕笁閮ㄥ垎鍐呭錛?嫻嬭瘯涓嬫柟娉曠殑鍚嶅瓧錛堣В鏋愶級錛屾祴璇曚笅鐨勭姸鎬佹垨鑰呰鍒欙紙甯︾潃絎竴涓礋鏁頒紶閫掍竴涓瓧絎︿覆錛夛紝浠ュ強棰勬湡鐨勮緭鍑烘垨鑰呰繍琛屾儏鍐碉紙鍓╀綑鏁板瓧鐨勬誨拰浠ヤ竴涓鏁扮殑褰㈠紡榪斿洖錛夈傞渶瑕佹敞鎰忕殑鏄垜浠庡悕縐頒腑灝員est浠ュ強Calc榪欎袱涓瘝鍒犻櫎銆傛垜宸茬粡鐭ラ亾榪欐槸涓涓睘鎬х殑嫻嬭瘯鍥犳鍦ㄦ娌℃湁閲嶅姝や俊鎭殑蹇呰銆傛垜涔熺煡閬撹繖鏄竴涓湪Calc綾諱腑鐨勬祴璇曞洜涓烘祴璇曠被緇忓父鏄啓緇欎竴涓壒孌婄被鐨勶紙榪欎釜綾諱篃璁稿凡緇忚鍛藉悕涓篊alcTests錛夈?/p>
鍚嶅瓧涔熻浼氬緢闀匡紝浣嗘槸鍙堟湁璋佸湪涔庡憿錛熷畠璇昏搗鏉ユ洿鍍忔槸涓涓爣鍑嗚嫳璇殑鍙ュ瓙鑰屼笖瀹冧嬌寰椾竴涓柊鏉ョ殑寮鍙戣呮洿瀹規槗鏄庣櫧嫻嬭瘯鐨勫唴瀹廣傛洿鏄繖鏍鳳紝褰撹繖涓祴璇曞彂鐢熸晠闅滄椂錛屾垜浠敋鑷充笉闇瑕佽皟璇曚唬鐮佸氨鍙互鐭ラ亾闂絀剁珶鍑哄湪鍝噷銆?/p>
闇瑕佹敞鎰忕殑鏄紝鎴戝凡緇忓湪鍓嶉潰鍒嗗埆瀹為檯婕旂ず浜嗛氳繃鍦ㄤ笉鍚岃涓垱寤轟竴涓粨鏋滃彉閲忕殑鏂規硶浠庡0鏄庢搷浣滀腑榪涜鍒嗚В鎿嶄綔銆傝繖鏍峰仛鑷沖皯鏈変袱涓悊鐢便傜涓涓悊鐢辨槸錛屼綘鍙互涓轟竴涓彉閲忓垎閰嶄竴涓彲璇繪у己鐨勫悕瀛楋紝瀹冨彲浠ュ寘鍚粨鏋滐紝榪欐牱鍙互浣夸綘鐨勫0鏄庤闈炲父鏄撲簬鐞嗚В浠ュ強鏄撲簬璇匯傜浜岀偣鏄紝嫻嬭瘯涓嬩笌瀵硅薄鐩稿弽鐨刬nvocation 鍙兘闈炲父鐨勯暱錛屽畠鍙兘浼氫嬌浣犵殑澹版槑琛屽歡浼稿嚭灞忓箷鐨勮竟緙樹箣澶栵紝榪欐牱瀵艱嚧嫻嬭瘯鑰呭悜鍙蟲粴灞忋傚氨鎴戜釜浜鴻岃█錛屾垜璁や負榪欎釜鏄潪甯告伡浜虹殑銆?/p>
鎴戝湪鎴戠殑嫻嬭瘯涓嬌鐢ㄤ簡寰堝甯擱噺浠ョ‘淇濇垜鐨勫0鏄庤璧鋒潵鍍忎竴鏈功銆傚湪鍏堝墠鐨勪緥瀛愪箣涓紝浣犲彲浠ヨ鍒板0鏄庝腑璇達細鈥滅‘淇濆垎瑙f繪暟鏄笌蹇界暐絎竴涓暟鍚庢墍寰楁誨拰鏄浉絳夌殑銆傗?涓轟綘鐨勫彉閲忓彇涓涓緢濂界殑鍚嶅瓧鑳藉鍦ㄦ煇浜涚▼搴︿笂寮ヨˉ瀵逛簬嫻嬭瘯鐨勫懡鍚嶄笉瓚熾?/p>
褰撶劧錛屾湁鏃朵竴涓0鏄?/b> 娑堟伅鏄湪涓涓崟鍏冩祴璇曚腑浼犻抜ntent鐨勬渶濂界殑鏂規硶銆?涓涓ソ鐨勫0鏄庢秷鎭緇堣兘澶熻В閲婁粈涔堝洜璇ヤ細鍙戠敓鎴栬呬粈涔堝彂鐢熶簡鑰屼笖涓轟粈涔堜細鍑洪敊銆備婦涓緥瀛愭潵璇達紝鈥滃垎鍒楀簲璇ュ拷鐣ユ帀絎竴涓暟瀛楀鏋滆繖涓暟瀛楁槸涓礋鏁扮殑璇濃濓紝鈥滃垎鍒椾笉鑳藉蹇界暐鎺夌涓涓礋鏁扳濓紝榪樻湁鈥淴璋冪敤瀵硅薄Y鏍囪閿欒鈥濊繖浜涢兘鏄湁鐢ㄧ殑澹版槑娑堟伅錛屽畠浠緢娓呮櫚鐨勬弿榪頒簡緇撴灉鐨勬儏鍐點?/p>
鍦ㄤ綘鐨勮緗柟娉曚腑閬垮厤閮ㄥ垎鐩稿叧鐨勪唬鐮?/h2>
涓涓?lt;TestInitialize()> 鏂規硶鏄牱渚嬫垚鍛樺彉閲忓湪嫻嬭瘯涓嬌鐢ㄧ殑涓涓ソ鍦版柟銆備綘鎵鏈夌殑嫻嬭瘯錛屽彧鏈夊湪涓閮ㄥ垎鐨勬祴璇曚腑閬垮厤鍙橀噺銆備粬浠彲浠ヤ負嫻嬭瘯璁劇疆鏈湴鍙橀噺銆傚鏋滀綘鍒涘緩浜嗛儴鍒嗙浉鍏崇殑瀹炰緥浣滀負綾葷殑鎴愬憳錛岀敤鏉ュ湪嫻嬭瘯涓畝鍗曠殑閬垮厤鍒涘緩鐨勫壇鏈紝浣犲簲璇ヤ嬌鐢ㄥ湪鏂囩珷鍓嶉潰瑙i噴鐨勫伐鍘傛柟娉曪紝浣跨敤閮ㄥ垎鐩稿叧鍙橀噺浣垮緱浣犵殑浠g爜鍜岃緗柟娉曠己灝戞槗璇繪с備竴鏃﹀彉閲忓湪涓涓垨鑰呮瘡涓祴璇曚腑浣跨敤錛岄偅涔堜粬搴旇鏄?lt;TestInitialize()> 鏂規硶鐨勪竴涓垚鍛樺拰鍙橀噺銆?/p>
Figure聽5 灞曠幇浜嗕竴涓嫢鏈変袱涓垚鍛樺彉閲忕殑綾葷殑嫻嬭瘯銆備絾鏄粬浠腑鐨勪竴涓?cxNum)鍙閮ㄥ垎浣跨敤銆?a target="_blank">Figure聽6 灞曠幇浜嗗浣曞湪嫻嬭瘯涓浛鎹唬鐮佷粠鑰屼嬌瀹冩洿鍔犳槗璇葷殑鏂規硶銆?/p>
灝卞儚浣犳墍鐪嬪埌鐨勶紝鍐欏崟鍏冩祴璇曞茍涓嶆槸涓涓井涓嶈凍閬撶殑浠誨姟錛屽鏋滄楠ゆ紜紝鍗曞厓嫻嬭瘯鍙互涓哄紑鍙戣呯殑鐢熶駭鍔涘拰浠g爜鐨勮川閲忓甫鏉ヤ護浜烘儕璁剁殑鎻愰珮錛屼粬鍙互甯姪浣犲幓鍒涘緩鐨勫簲鐢ㄧ▼搴忓惈鏈夋洿灝戠殑閿欒錛屽悓鏃朵篃鍙互渚夸簬鍏朵粬鐨勫紑鍙戣呭幓媧炲療浣犵殑浠g爜錛屼絾鏄粬涔熼渶瑕佸湪涔嬪墠鎵挎媴涓涓箟鍔★紝紜閬靛驚涓浜涚畝鍗曠殑瑙勫垯銆傚綋鏂規硶騫朵笉鏄緢濂芥椂錛屽崟鍏冩祴璇曞垯鍙兘杈懼埌涓涓浉鍙嶇殑緇撴灉錛屼粠鑰屾氮璐規偍鐨勬椂闂達紝騫朵笖浣挎祴璇曡繃紼嬫洿鍔犲鏉傘?/p>
Roy Osherove Agile緇勭殑璐熻矗浜? 榪欎釜欏鵑棶鍏徃鑷村姏浜巃gile software development 鍜?.NET architecture鐨勭爺絀跺伐浣? Roy鍚屾椂緇存姢浜嗕竴涓猙log鍦?a target="_blank"> www.iserializable.com涓婃湁鐩稿叧鐨勪俊鎭? 浣犲彲浠ラ氳繃Email鑱旂郴浠栵細 Roy@TeamAgile.com.
Mark Michaelis
Itron Corporation
鎽樿錛?/b>鏈紨緇冮氳繃嫻嬭瘯椹卞姩寮鍙?(TDD) 鍜屽厛嫻嬭瘯-鍚庣紪鐮?(test-then-code) 鐨勬柟娉曞涔犲崟鍏冩祴璇曘?/p>
![]() |
綆浠?/a> |
![]() |
寮濮?/a> |
![]() |
鍒涘緩嫻嬭瘯 |
![]() |
榪愯嫻嬭瘯 |
![]() |
媯鏌ュ紓甯?/a> |
![]() |
浠庢暟鎹簱涓姞杞芥祴璇曟暟鎹?/a> |
![]() |
嫻嬭瘯瑙嗗浘 (Test View) 紿楀彛 |
![]() |
澧炲姞涓涓祴璇曟暟鎹簱 |
![]() |
灝嗘暟鎹笌嫻嬭瘯鍏寵仈 |
![]() |
瀹炵幇鍜岄噸鏋勭洰鏍囨柟娉?/a> |
![]() |
浠g爜瑕嗙洊 |
![]() |
鍒濆鍖栧拰娓呴櫎嫻嬭瘯 |
![]() |
鏈浣沖疄璺?/a> |
![]() |
灝忕粨 |
鏈鏂板彂甯冪殑 Visual Studio Test System (VSTS) 鍖呭惈浜嗕竴濂楃敤浜?Visual Studio Team Test 鐨勫畬鏁村姛鑳姐俆eam Test 鏄?Visual Studio 闆嗘垚鐨勫崟鍏冩祴璇曟鏋訛紝瀹冩敮鎸侊細
鈥?/td> |
嫻嬭瘯鏂規硶瀛樻牴 (stub) 鐨勪唬鐮佺敓鎴愩?/p> |
鈥?/td> |
鍦?IDE 涓繍琛屾祴璇曘?/p> |
鈥?/td> |
鍚堝茍浠庢暟鎹簱涓姞杞界殑嫻嬭瘯鏁版嵁銆?/p> |
鈥?/td> |
嫻嬭瘯榪愯瀹屾垚鍚庯紝榪涜浠g爜瑕嗙洊鍒嗘瀽銆? |
鍙﹀錛孴eam Test 鍖呭惈浜嗕竴濂楁祴璇曞姛鑳斤紝鍙互鍚屾椂鏀寔寮鍙戜漢鍛樺拰嫻嬭瘯浜哄憳銆?/p>
鍦ㄦ湰鏂囦腑錛屾垜浠噯澶囨紨緇冨浣曞垱寤篢eam Test 鐨勫崟鍏冩祴璇曘傛垜浠粠涓涓畝鍗曠殑紺轟緥紼嬪簭闆嗗紑濮嬶紝鐒跺悗鍦ㄨ紼嬪簭闆嗕腑鐢熸垚鍗曞厓嫻嬭瘯鏂規硶瀛樻牴銆傝繖鏍峰彲浠ヤ負Team Test 鍜屽崟鍏冩祴璇曠殑鏂版墜璇昏呮彁渚涘熀鏈殑璇硶鍜屼唬鐮侊紝鍚屾椂涔熷緢濂藉湴浠嬬粛浜嗗浣曞揩閫熷緩绔嬫祴璇曢」鐩殑緇撴瀯銆傜劧鍚庯紝鎴戜滑杞埌浣跨敤嫻嬭瘯椹卞姩寮鍙?(test driven development, TDD) 鏂規硶錛屽嵆鍦ㄥ啓浜у搧浠g爜鍓嶅厛鍐欏崟鍏冩祴璇曘?/p>
Team Test鐨勪竴涓叧閿壒鐐規槸浠庢暟鎹簱涓姞杞芥祴璇曟暟鎹紝鐒跺悗灝嗗叾鐢ㄤ簬嫻嬭瘯鏂規硶銆傚湪婕旂ず鍩烘湰鐨勫崟鍏冩祴璇曞悗錛屾垜浠弿榪板浣曞垱寤烘祴璇曟暟鎹茍闆嗘垚鍒版祴璇曚腑銆?/p>
鏈枃涓嬌鐢ㄧ殑紺轟緥欏圭洰鍖呭惈涓涓?LongonInfo 綾伙紝瀹冨皝瑁呬簡涓庣櫥褰曠浉鍏崇殑鏁版嵁錛堜緥濡傜敤鎴峰悕鍜屽瘑鐮侊級浠ュ強涓浜涘叧浜庢暟鎹殑綆鍗曠殑楠岃瘉瑙勫垯銆傛渶緇堢殑綾誨涓嬪浘 1 鎵紺恒?/p>
鍥?/b> 1. 鏈緇堢殑 LogonInfo 綾?/b>
璇鋒敞鎰忔墍鏈夌殑嫻嬭瘯浠g爜浣嶄簬涓涓崟鐙殑欏圭洰銆傝繖鏄湁閬撶悊鐨勶紝浜у搧浠g爜搴旇灝藉彲鑳藉皯鐨勫彈嫻嬭瘯浠g爜褰卞搷錛屾墍浠ユ垜浠笉鎯沖湪浜у搧浠g爜鐨勭▼搴忛泦涓祵鍏ユ祴璇曚唬鐮併?/p>
棣栧厛錛屾垜浠垱寤轟竴涓悕涓衡淰STSDemo鈥濈殑綾誨簱欏圭洰銆傞粯璁ゆ儏鍐典笅錛?b>涓烘柟妗堝垱寤虹洰褰?/b>(Create directory for solution) 澶嶉夋琚変腑銆備繚鐣欐閫夐」鍙互浣挎垜浠湪 VSTSDemo 欏圭洰鐨勫悓涓灞傜洰褰曞垱寤烘祴璇曢」鐩傜浉鍙嶏紝濡傛灉涓嶉変腑姝ら夐」錛孷isual Studio 2005 浼氬皢嫻嬭瘯欏圭洰鏀懼湪 VSTSDemo 欏圭洰鐨勫瓙鐩綍涓傛祴璇曢」鐩伒寰?Visual Studio 鍦ㄨВ鍐蟲柟妗堟枃浠惰礬寰勭殑瀛愮洰褰曚腑鍒涘緩棰濆欏圭洰鐨勮瀹氥?/p>
鍒涘緩鍒濆鐨?VSTSDemo 欏圭洰鍚庯紝鎴戜滑浣跨敤 Visual Studio 鐨勮В鍐蟲柟妗堣祫婧愮鐞嗗櫒灝?Class1.cs 鏂囦歡閲嶅懡鍚嶄負 LogonInfo.cs錛岃繖鏍風被鍚嶄篃浼氳鏇存柊涓?LogonInfo銆傜劧鍚庢垜浠慨鏀規瀯閫犲嚱鏁頒互鎺ュ彈涓や釜瀛楃涓插弬鏁幫細userId 鍜?password銆備竴鏃︽瀯閫犲嚱鏁扮殑絳懼悕琚0鏄庯紝鎴戜滑灝卞彲浠ヤ負鏋勯犲嚱鏁扮敓鎴愭祴璇曘?/p>
鍥?/b> 2. LongonInfo 鏋勯犲嚱鏁扮殑涓婁笅鏂囪彍鍗曠殑鈥滃垱寤烘祴璇?/b> 鈥?/b> 鈥?/b> ( Create Tests... ) 鑿滃崟欏?/b>
鍦ㄥ紑濮嬬紪鍐?LogonInfo鐨勪換浣曞疄鐜頒箣鍓嶏紝鎴戜滑閬靛驚 TDD 瀹炶返鐨勮鍒欙紝棣栧厛緙栧啓嫻嬭瘯銆俆DD 鍦═eam Test 涓茍涓嶆槸蹇呴渶鐨勶紝浣嗘渶濂藉湪鏈枃鐨勫墿浣欓儴鍒嗛伒寰?TDD銆傚彸閿崟鍑?LogonInfo()鏋勯犲嚱鏁幫紝鐒跺悗閫夋嫨鈥滃垱寤烘祴璇曗︹濊彍鍗曢」(濡傚浘 2 鎵紺?銆傝繖鏍蜂細鍑虹幇涓涓璇濇錛屽彲浠ュ湪涓嶅悓鐨勯」鐩腑鐢熸垚鍗曞厓嫻嬭瘯錛堝鍥?3 鎵紺猴級銆傞粯璁ゆ儏鍐典笅錛岄」鐩緗殑杈撳嚭 (Output) 閫夐」鏄竴涓柊鐨?Visual Basic 欏圭洰錛屼絾鏄篃鍙互閫夋嫨 C# 鍜?C++ 嫻嬭瘯欏圭洰銆傚湪鏈枃涓紝鎴戜滑閫夋嫨 Visual C#錛岀劧鍚庡崟鍑?OK 鎸夐挳錛屾帴鐫杈撳叆欏圭洰鍚?VSTSDemo.Test銆傛祴璇曢」鐩悕縐般?/p>
鍥?/b> 3. 鐢熸垚鍗曞厓嫻嬭瘯瀵硅瘽妗?/b>
鐢熸垚鐨勬祴璇曢」鐩寘鍚洓涓笌嫻嬭瘯鐩稿叧鐨勬枃浠躲?/p>
鏂囦歡鍚?/td> | 鐩殑 |
AuthoringTest.txt |
鎻愪緵鍏充簬鍒涘緩嫻嬭瘯鐨勮鏄庯紝鍖呮嫭鍚戦」鐩鍔犲叾浠栨祴璇曠殑璇存槑銆?/p> |
LogonInfoTest.cs |
鍖呭惈浜嗙敤浜庢祴璇?LogonInfo()鐨勭敓鎴愭祴璇曪紝浠ュ強嫻嬭瘯鍒濆鍖栧拰嫻嬭瘯娓呴櫎鐨勬柟娉曘?/p> |
ManualTest1.mht |
鎻愪緵浜嗕竴涓ā鏉匡紝鍙互濉叆鎵嬪伐嫻嬭瘯鐨勬寚浠ゃ?/p> |
UnitTest1.cs |
涓涓┖鐨勫崟鍏冩祴璇曠被鏋舵瀯錛岀敤浜庢斁鍏ュ彟澶栫殑鍗曞厓嫻嬭瘯銆?/p> |
鍥犱負鎴戜滑涓嶆墦綆楀璇ラ」鐩繘琛屾墜宸ユ祴璇曪紝騫朵笖鐢變簬宸茬粡鏈変簡涓涓崟鍏冩祴璇曟枃浠訛紝鎴戜滑灝嗗垹闄?ManualTest1.mht 鍜?UnitTest1.cs銆?/p>
闄や簡涓浜涢粯璁ょ殑鏂囦歡錛岀敓鎴愮殑嫻嬭瘯欏圭洰榪樺寘鍚簡瀵?Microsoft.VisualStudio.QualityTools.UnitTestFramework鍜?VSTSDemo 欏圭洰鐨勫紩鐢ㄣ傚墠鑰呮槸嫻嬭瘯寮曟搸榪愯鍗曞厓嫻嬭瘯闇瑕佷緷璧栫殑嫻嬭瘯妗嗘灦紼嬪簭闆嗭紝鍚庤呮槸瀵規垜浠渶瑕佹祴璇曠殑鐩爣紼嬪簭闆嗙殑欏圭洰寮曠敤銆?/p>
榛樿鎯呭喌涓嬶紝鐢熸垚鐨勬祴璇曟柟娉曟槸鍖呭惈浠ヤ笅瀹炵幇鐨勫崰浣嶇錛?/p>
娓呭崟 1. 鐢熸垚鐨勬祴璇曟柟娉曪細 ConstructorTest(), 浣嶄簬 VSTSDemo.Test.LogonInfoTest
/// <summary> ///This is a test class for VSTTDemo.LogonInfo and is intended ///to contain all VSTTDemo.LogonInfo Unit Tests ///</summary> [TestClass()] public class LogonInfoTest { // ... /// <summary> ///A test case for LogonInfo (string, string) ///</summary> [TestMethod()] public void ConstructorTest() { string userId = null; // TODO: Initialize to an appropriate value string password = null; // TODO: Initialize to an appropriate value LogonInfo target = new LogonInfo(userId, password); // TODO: Implement code to verify target Assert.Inconclusive( "TODO: Implement code to verify target"); } }
紜垏鐨勭敓鎴愪唬鐮佷細鏍規嵁嫻嬭瘯鐩爣鐨勬柟娉曠被鍨嬪拰絳懼悕涓嶅悓鑰屾湁鎵涓嶅悓銆備緥濡傦紝鍚戝浼氫負縐佹湁鎴愬憳鍑芥暟鐨勬祴璇曠敓鎴愬弽灝勪唬鐮併傚湪榪欑鐗瑰埆鐨勬儏鍐典笅錛屾垜浠渶瑕佷笓闂ㄧ敤浜庡叕鏈夋瀯閫犲嚱鏁版祴璇曠殑浠g爜銆?/p>
鍏充簬Team Test 錛屾湁涓や釜閲嶈鐨勭壒鎬с傞鍏堬紝浣滀負嫻嬭瘯鐨勬柟娉曠敱 TestMethodAttribute灞炴ф寚瀹氾紝鍙﹀錛屽寘鍚祴璇曟柟娉曠殑綾繪湁 TestClassAttribute灞炴с傝繖浜涘睘鎬ч兘鍙互鍦?Microsoft.VisualStudio.QualityTools.UnitTesting.Framework 鍛藉悕絀洪棿涓壘鍒般俆eam Test 浣跨敤鍙嶅皠鏈哄埗鍦ㄦ祴璇曠▼搴忛泦涓悳绱㈡墍鏈夌敱 TestClass淇グ鐨勭被錛岀劧鍚庢煡鎵劇敱 TestMethodAttribute淇グ鐨勬柟娉曟潵鍐沖畾鎵ц鐨勫唴瀹廣傚彟澶栦竴涓噸瑕佺殑鐢辨墽琛屽紩鎿庤屼笉鏄紪璇戝櫒楠岃瘉鐨勬爣鍑嗘槸錛屾祴璇曟柟娉曠殑絳懼悕蹇呴』鏄棤鍙傛暟鐨勫疄渚嬫柟娉曘傚洜涓哄弽灝勬悳绱?TestMethodAttribute錛屾墍浠ユ祴璇曟柟娉曞彲浠ヤ嬌鐢ㄤ換鎰忕殑鍚嶅瓧銆?/p>
嫻嬭瘯鏂規硶 ConstructorTest()棣栧厛瀹炰緥鍖栫洰鏍?LongonInfo 綾伙紝鐒跺悗鏂█嫻嬭瘯鏄潪鍐沖畾鎬х殑(浣跨敤Assert.Inconclusive())銆傚綋嫻嬭瘯榪愯鏃訛紝Assert.Inconclusive()璇存槑浜嗗畠鍙兘緙哄皯姝g‘鐨勫疄鐜般傚湪鎴戜滑鐨勭ず渚嬩腑錛屾垜浠洿鏂?ConstructorTest()鏂規硶錛岃瀹冩鏌ョ敤鎴峰悕鍜屽瘑鐮佺殑鍒濆鍖栵紝濡備笅鎵紺恒?/p>
娓呭崟 2. 鏇存柊鐨?/b> ConstructorTest() 瀹炵幇
/// <summary> ///A test case for LogonInfo (string, string) ///</summary> [TestMethod()] public void ConstructorTest() { string userId = "IMontoya"; string password = "P@ssw0rd"; LogonInfo logonInfo = new LogonInfo(userId, password); Assert.AreEqual<string>(userId, logonInfo.UserId, "The UserId was not correctly initialized."); Assert.AreEqual<string>(password, logonInfo.Password, "The Password was not correctly initialized."); }
璇鋒敞鎰忔垜浠殑媯鏌ヤ嬌鐢?Assert.AreEqual<T>() 鏂規硶瀹屾垚銆?b>Assert鏂規硶涔熸敮鎸佹病鏈夋硾鍨嬬殑 AreEqual()錛屼絾鏄硾鍨嬬増鏈嚑涔庢繪槸棣栭夛紝鍥犱負瀹冧細鍦ㄧ紪璇戞椂楠岃瘉綾誨瀷鍖歸厤 錛?鍦?CLR 鏀寔娉涘瀷鍓嶏紝榪欑閿欒鍦ㄥ崟鍏冩祴璇曟鏋朵腑闈炲父鏅亶銆?/p>
鍥犱負 UserID 鍜?Password 鐨勫疄渚嬪煙榪樻病鏈夊垱寤猴紝鎴戜滑闇瑕佸洖澶村皢鍏舵坊鍔犲埌 LogonInfo綾諱腑錛屼互渚縑STTDemo.Test 欏圭洰鍙互緙栬瘧銆?/p>
鍗充嬌鎴戜滑榪樻病鏈変竴涓湁鏁堢殑瀹炵幇錛岃鎴戜滑寮濮嬭繍琛屾祴璇曘傚鏋滄垜浠伒寰?TDD 鏂規硶錛屾垜浠氨搴旇鐩村埌嫻嬭瘯璇佹槑鎴戜滑闇瑕佽繖鏍風殑浠g爜鏃舵墠鍘葷紪鍐欎駭鍝佷唬鐮併傛垜浠粎鍦ㄥ緩绔嬮」鐩粨鏋勬椂榪濊儗姝ゅ師鍒欙紝浣嗘槸涓鏃﹂」鐩緩绔嬪悗錛屽氨鍙互瀹規槗鍦板緇堥伒寰?TDD 鏂規硶銆?/p>
瑕佽繍琛岄」鐩腑鐨勬墍鏈夋祴璇曪紝鍙渶瑕佽繍琛屾祴璇曢」鐩傝瀹炵幇榪欎竴鐐癸紝鎴戜滑闇瑕佸彸閿崟鍑昏В鍐蟲柟妗堣祫婧愮鐞嗗櫒鐨刅STSDemo.Test 欏圭洰錛岄夋嫨璁劇疆涓哄惎鍔ㄩ」鐩?/b>(Set as StartUp Project)銆傛帴鐫錛屼嬌鐢ㄨ彍鍗曢」璋冭瘯->鍚姩(F5) 鎴栬?b>璋冭瘯->寮濮嬫墽琛岋紙涓嶈皟璇曪級(Ctrl+F5) 寮濮嬭繍琛屾祴璇曘?/p>
榪欐椂鍑虹幇嫻嬭瘯緇撴灉紿楀彛錛屽垪鍑洪」鐩腑鐨勬墍鏈夋祴璇曘傚洜涓烘垜浠殑欏圭洰鍙寘鍚竴涓祴璇曪紝鍥犳鍙垪鍑轟簡涓涓祴璇曘傚紑濮嬬殑鏃跺欙紝嫻嬭瘯浼氬浜庢寕璧風殑鐘舵侊紝浣嗘槸涓鏃︽祴璇曞畬鎴愶紝緇撴灉灝嗘槸鎴戜滑鎰忔枡涓殑澶辮觸錛堝鍥?4 鎵紺猴級銆?/p>
鍥?/b> 4. 鎵ц鎵鏈夋祴璇曞悗鐨勬祴璇曠粨鏋滅獥鍙?/b>
鍥?4 鏄劇ず浜?b>嫻嬭瘯緇撴灉 (Test Results) 紿楀彛銆傝繖涓壒鍒殑灞忓箷蹇収闄や簡榛樿鐨勫垪澶栵紝榪樻樉紺轟簡閿欒淇℃伅銆傛偍鍙互鍦ㄥ垪澶翠笂鍗曞嚮鍙抽敭騫墮夋嫨鑿滃崟欏?b>澧炲姞/鍒犻櫎鍒椻?/b>浠ュ鍔犳垨鑰呭垹闄ゅ垪銆?/p>
濡傛灉瑕佹煡鐪嬫祴璇曠殑棰濆緇嗚妭錛屾垜浠彲浠ラ夊畾嫻嬭瘯騫跺弻鍑伙紝鎵撳紑鈥淐onstructorTest[Results]鈥濈獥鍙o紝濡傚浘 5 鎵紺恒?/p>
鍥?/b> 5. 璇︾粏鐨勬祴璇?/b> ConstructorTest [ Results ] 紿楀彛
鍙﹀錛屾垜浠彲浠ュ彸閿崟鍑誨崟涓祴璇曪紝鐒跺悗閫夋嫨鎵撳紑嫻嬭瘯(Open Test) 鑿滃崟欏癸紝榪涘叆嫻嬭瘯浠g爜銆傚洜涓烘垜浠凡緇忕煡閬撻棶棰樺湪浜?LogonInfo 鏋勯犲嚱鏁扮殑瀹炵幇錛屾垜浠彲浠ュ幓閭i噷緙栧啓鍒濆鍖?UserID 鍜?Password 瀛楁鐨勪唬鐮侊紝浣跨敤浼犲叆鐨勫弬鏁板瀹冧滑榪涜鍒濆鍖栥傞噸鏂拌繍琛屾祴璇曚互楠岃瘉嫻嬭瘯鐜板湪鍙互閫氳繃銆?/p>
涓嬩竴姝ユ槸鍒涘緩 LongonInfo 綾伙紝浠ユ彁渚涘 UserID 鍜?password 鐨勪竴浜涢獙璇併備笉騫哥殑鏄紝UserID鍜?Password 瀛楁鏄叕鍏辯殑錛岃繖鎰忓懗鐫瀹冧滑娌℃湁鎻愪緵浠諱綍灝佽鏉ョ‘淇濆畠浠湁鏁堛備絾鏄湪鎴戜滑灝嗗叾杞崲涓哄睘鎬у茍鎻愪緵楠岃瘉鍓嶏紝璁╂垜浠紪鍐欎竴浜涙祴璇曟潵楠岃瘉浠諱綍瀹炵幇鐨勭粨鏋滈兘鏄紜殑銆?/p>
鎴戜滑棣栧厛鏉ョ紪鍐欎竴涓祴璇曪紝闃叉絀哄?(null) 鎴栫┖瀛楃涓茶祴鍊肩粰 UserID銆傞鏈熺粨鏋滄槸錛屽鏋滅┖鍊間紶閫佺粰鏋勯犲嚱鏁幫紝浼氬紩鍙戜竴涓?ArgumentException寮傚父銆傛祴璇曚唬鐮佸娓呭崟 3 鎵紺恒?/p>
娓呭崟 3. 浣跨敤 ExpectedExceptionAttribute 瀵瑰紓甯告儏鍐佃繘琛屾祴璇?/b>
[TestMethod] [ExpectedException(typeof(ArgumentException), "A userId of null was inappropriately allowed.")] public void NullUserIdInConstructor() { LogonInfo logonInfo = new LogonInfo(null, "P@ss0word"); } [TestMethod] [ExpectedException(typeof(ArgumentException), "A empty userId was inappropriately allowed.")] public void EmptyUserIdInConstructor() { LogonInfo logonInfo = new LogonInfo("", "P@ss0word"); }
璇鋒敞鎰忓浜?ArgumentException娌℃湁 try-catch 浠g爜鍧楃殑鏄懼紡嫻嬭瘯銆備笉榪囷紝涓や釜嫻嬭瘯閮藉寘鍚彟澶栦竴涓睘鎬?ExpectedException錛屽畠鎺ュ彈涓涓被鍨嬪弬鏁幫紝浠ュ強涓涓彲閫夌殑閿欒淇℃伅錛岀敤浜庡湪娌℃湁寮曞彂寮傚父鏃舵樉紺恒傚綋榪欎釜鍗曞厓嫻嬭瘯鎵ц鏃訛紝嫻嬭瘯妗嗘灦浼氭樉寮忓湴鐩戣寮曞彂鐨?ArgumentException寮傚父錛屽鏋滄柟娉曟病鏈夊紩鍙戣繖涓紓甯革紝嫻嬭瘯灝嗗け璐ャ傝繍琛岃繖浜涙祴璇曚細璇佹槑鎴戜滑榪樻病鏈夊 UserID 鍋氫換浣曢獙璇佹鏌ワ紱鍥犳錛屾祴璇曚細澶辮觸錛屽洜涓烘病鏈夊紩鍙戦鏈熺殑寮傚父銆?/p>
鏈変簡澶辮觸鐨勬祴璇曪紝鐜板湪鍙互鍥炲埌浜у搧浠g爜榪涜鏇存柊鏉ユ彁渚涙祴璇曢渶瑕佹鏌ョ殑鍔熻兘銆傚湪榪欎釜渚嬪瓙涓紝鎴戜滑灝?UserID瀛楁杞崲涓哄睘鎬э紝騫舵彁渚涢獙璇佹鏌ワ紙娓呭崟 4錛夈?/p>
娓呭崟 4. 鍦?/b> LogonInfo 綾諱腑楠岃瘉 UserId
public class LogonInfo { public LogonInfo(string userId, string password) { this.UserId = userId; this.Password = password; } private string _UserId; public string UserId { get { return _UserId; } private set { if (value == null || value.Trim() == string.Empty) { throw new ArgumentException( "Parameter userId may not be null or blank."); } _UserId = value; } } // ... }
灞炴х殑瀹炵幇浣跨敤浜?C# 2.0 鐨勫姛鑳斤紝鍏朵腑 getter 鍜?setter 鐨勮闂潈闄愪笉涓鑷淬俿etter鐨勫疄鐜版爣璇嗕負縐佹湁錛岃?getter 瀹炵幇涓哄叕鏈夈傝繖鏍?UserID 灝變笉鑳藉湪 LogonInfo 綾誨琚慨鏀逛簡錛堥櫎闈為氳繃鍙嶅皠鏈哄埗錛夈?/p>
涓鏃﹀鍔犱簡楠岃瘉錛屾垜浠彲浠ラ噸鏂拌繍琛屾祴璇曟潵楠岃瘉瀹炵幇鏄紜殑銆傛垜浠繍琛屾墍鏈夌殑涓変釜嫻嬭瘯鏉ラ獙璇?UserID 瀛楁杞崲涓哄睘鎬х殑閲嶆瀯榪囩▼娌℃湁浜х敓浠諱綍鎰忓鐨勯敊璇傚崟鍏冩祴璇曠殑鐪熸浠峰煎湪浠g爜淇敼鐨勬椂鍊欐墠鐪熸鏈夋墍浣撶幇銆備竴濂楀崟鍏冩祴璇曞彲浠ヤ繚璇佹垜浠湪緇存姢鍜屾敼榪涗唬鐮佺殑鏃跺欐病鏈夌牬鍧忎唬鐮併?/p>
瀵逛簬 LogonInfo 綾葷殑涓嬩竴嬈′慨鏀癸紝鎴戜滑灝嗘彁渚涗竴涓柟娉曟潵鏀瑰彉瀵嗙爜銆傝鏂規硶鎺ュ彈鏃у瘑鐮佸拰鏂板瘑鐮佷綔涓哄弬鏁般傚彟澶栵紝鎴戜滑浼氶獙璇佸瘑鐮佺鍚堟煇縐嶅鏉傛ч渶姹傘傜‘鍒囩殑璇達紝鎴戜滑灝嗕繚璇佸瘑鐮佺鍚?Windows Active Directory 鐨勯粯璁ら渶姹傦紝鍗沖寘鍚互涓嬪洓縐嶇被鍨嬪瓧絎︿腑鐨勪笁縐嶏細
鈥?/td> |
澶у啓瀛楁瘝 |
鈥?/td> |
灝忓啓瀛楁瘝 |
鈥?/td> |
鏍囩偣絎﹀彿 |
鈥?/td> |
鏁板瓧 |
鍙﹀錛屾垜浠皢媯鏌ュ瘑鐮佹渶灝戝寘鍚?6 涓瓧絎︼紝鏈澶氬寘鍚?255 涓瓧絎︺?/p>
鍜屼箣鍓嶄竴鏍鳳紝鎴戜滑鍦ㄧ紪鍐欏疄鐜板墠鍏堜負瀵嗙爜澶嶆潅鎬ч渶姹傜紪鍐欐祴璇曘備絾鏄樉鐒訛紝鎴戜滑闇瑕佹彁渚涗竴涓祴璇曞肩殑澶ч泦鍚堢敤浜庨獙璇佸疄鐜般傛垜浠笉鏄負姣忎釜嫻嬭瘯鐢ㄤ緥鍒涘緩涓涓崟鐙殑嫻嬭瘯錛屼篃涓嶆槸鍒涘緩涓涓驚鐜潵璋冪敤涓緋誨垪鐨勬祴璇曠敤渚嬶紝鎴戜滑灝嗗垱寤轟竴涓暟鎹┍鍔ㄦ祴璇曪紝瀹冧粠鏁版嵁搴撲腑鍙栧嚭鎵闇鐨勬暟鎹?/p>
棣栧厛鎴戜滑瀹氫箟涓涓悕涓?ChangePasswordTest() 鐨勬柊嫻嬭瘯銆傚畾涔夊悗錛屼粠鑿滃崟欏?b>嫻嬭瘯->鏌ョ湅鍜屽垱寤烘祴璇?/b>(Test->View and Author Tests)涓烘祴璇曟柟娉曟墦寮嫻嬭瘯瑙嗗浘紿楀彛錛屽鍥?6 鎵紺猴細
鍥?/b> 6. 嫻嬭瘯瑙嗗浘 ( Test view ) 紿楀彛
嫻嬭瘯瑙嗗浘紿楀彛鍙敤鏉ヨ繍琛屾寚瀹氱殑嫻嬭瘯鍜屾祻瑙堟祴璇曠殑鐗瑰畾灞炴с傞氳繃澧炲姞棰濆鐨勫垪錛堝彸閿崟鍑誨垪澶村茍閫夋嫨娣誨姞/鍒犻櫎鍒椻︼級錛屾垜浠彲浠ユ帓搴忓茍鏍規嵁鍋忓ソ鏌ョ湅嫻嬭瘯銆傛湁浜涘垪鏉ヨ嚜淇グ嫻嬭瘯鐨勫睘鎬с備緥濡傦紝娣誨姞 OwnerAttribute灝嗗湪鎵鏈夎呭垪鏄劇ず嫻嬭瘯鐨勬墍鏈夎呫傚叾瀹冨厓鏁版嵁灞炴э紙濡?DescriptionAttribute錛?/b>涔熷彲浠ヤ嬌鐢ㄣ傝繖浜涘睘鎬ч兘鍙互鍦?Microsoft.VisualStudio.QualityTools.UnitTesting.Framework 鍛藉悕絀洪棿涓壘鍒般傚鏋滄病鏈夋樉寮忕殑灞炴у瓨鍦紝閭d箞鎴戜滑鍙互浣跨敤鑷敱褰㈠紡鐨?TestPropertyAttribute鏉ヤ負鐗瑰埆鐨勬祴璇曟柟娉曞鍔犲悕錛嶅煎銆?/p>
娌℃湁瀵瑰簲鍒楃殑灞炴у彲浠ュ湪涓涓祴璇曠殑灞炴х獥鍙d腑鏄劇ず錛堥夋嫨涓涓祴璇曪紝鍦ㄥ彸閿笂涓嬫枃鑿滃崟涓崟鍑?b>灞炴?/b>錛夈傚畠鍖呭惈浜嗘寚瀹氭暟鎹繛鎺ュ瓧絎︿覆鍜岀敤浜庤澆鍏ユ祴璇曟暟鎹殑琛ㄥ悕鐨勫睘鎬с傛樉鐒訛紝涓轟簡鎸囧畾鏈夋晥鍊鹼紝鎴戜滑闇瑕佷竴涓暟鎹簱榪炴帴銆?/p>
浠庢湇鍔″櫒璧勬簮綆$悊鍣ㄧ獥鍙o紝鎴戜滑鍙互浣跨敤鍒涘緩鏂扮殑 SQL Server鏁版嵁搴?/b>(Create new SQL Server Database) 鑿滃崟欏廣備絾鏄灝忓績榪欑鏂規硶錛屽鏋滄垜浠鍦ㄥ叾瀹冭綆楁満涓婃墽琛屾祴璇曠殑璇濓紝鎴戜滑瑕佷繚璇佸湪涓鍙版湇鍔″櫒涓婂垱寤烘暟鎹簱錛屽叾瀹冨彲鑳芥墽琛屾祴璇曠殑璁$畻鏈哄繀欏昏兘澶熻闂鏈嶅姟鍣?鈥?渚嬪涓鍙扮敤浜庢瀯寤虹殑璁$畻鏈恒?/p>
鍙﹀涓涓夋嫨鏄粎浠呭鍔犱竴涓暟鎹簱鏂囦歡銆備嬌鐢?b>欏圭洰->澧炲姞鏂伴」鈥?/b> (Project->Add new item...) 鍏佽鍚戦」鐩彃鍏ヤ竴涓?SQL 鏁版嵁搴撴枃浠躲傝繖縐嶆柟娉曚嬌嫻嬭瘯鏁版嵁鍜屾祴璇曢」鐩繚鎸佸湪涓璧楓傜己鐐規槸濡傛灉鏁版嵁搴撳彉寰楀緢澶э紝鎴戜滑灝變笉鎯寵繖涔堝仛錛岃屽畞鍙彁渚涘叏灞鐨勬暟鎹簮銆?/p>
瀵逛簬鏈」鐩腑鐨勬暟鎹紝鎴戜滑鍒涘緩涓涓悕涓?VSTSDemo.mdf鐨勬湰鍦伴」鐩暟鎹簱鏂囦歡銆備負浜嗗悜鏂囦歡鍔犲叆嫻嬭瘯鏁版嵁錛屾垜浠嬌鐢ㄨ彍鍗?b>宸ュ叿->榪炴帴鍒版暟鎹簱 (Tools->Connect to Database)錛岀劧鍚庢寚瀹?VSTSDemo.mdf 鏂囦歡銆傜劧鍚庯紝浠庢湇鍔″櫒璧勬簮綆$悊鍣ㄧ獥鍙f垜浠彲浠ヤ嬌鐢ㄨ璁″櫒鍔犲叆涓涓柊鐨勮〃 LongonInfoTest銆傛竻鍗?5 鏄劇ず浜嗚琛ㄧ殑瀹氫箟銆?/p>
娓呭崟 5. LogonInfoTestData SQL 鑴氭湰
CREATE TABLE dbo.LogonInfoTest ( UserId nchar(256) NOT NULL PRIMARY KEY CLUSTERED, Password nvarchar(256) NULL, IsValid bit NOT NULL ) ON [PRIMARY] GO
淇濆瓨琛ㄥ悗錛屾垜浠彲浠ュ皢鍏舵墦寮錛岀劧鍚庤緭鍏ヤ笉鍚岀殑闈炴硶瀵嗙爜錛屽涓嬭〃鎵紺恒?/p>
UserId | Password | IsValid |
Humperdink |
P@w0d |
False |
IMontoya |
p@ssword |
False |
Inigo.Montoya |
P@ssw0rd |
False |
Wesley |
Password |
False |
涓鏃﹀畬鎴愯〃鐨勫垱寤猴紝鎴戜滑闇瑕佸皢鍏朵笌嫻嬭瘯 InvalidPasswords()鑱旂郴璧鋒潵銆備粠嫻嬭瘯 InvalidPasswords鐨勫睘鎬х獥鍙o紝鎴戜滑濉啓鏁版嵁榪炴帴瀛楃涓?/b>(Data Connection String) 鍜?b>鏁版嵁琛ㄥ悕 (Data Table Name) 灞炴с傝繖鏍峰仛灝嗕嬌鐢ㄩ檮鍔犵殑灞炴?DataSourceAttribute鍜?DataTableNameAttribute鏇存柊嫻嬭瘯銆傛渶緇堢殑鏂規硶 ChangePasswordTest()鍦ㄦ竻鍗?6 涓樉紺恒?/p>
娓呭崟 6. 鐢ㄤ簬鏁版嵁椹卞姩嫻嬭瘯鐨勬祴璇曚唬鐮?/b>
enum Column { UserId, Password, IsValid } private TestContext testContextInstance; /// <summary> ///Gets or sets the test context which provides ///information about and functionality for the ///current test run. ///</summary> public TestContext TestContext { get { return testContextInstance; } set { testContextInstance = value; } } [TestMethod] [Owner("Mark Michaelis")] [TestProperty("TestCategory", "Developer"), DataSource("System.Data.SqlClient", "Data Source=.\\SQLEXPRESS;AttachDbFilename=\"<Path to the sample .mdf file>";Integrated
Security=True", "LogonInfoTest", DataAccessMethod.Sequential)] public void ChangePasswordTest() { string userId = (string)TestContext.DataRow[(int)Column.UserId]; string password = (string)TestContext.DataRow[(int)Column.Password]; bool isValid = (bool)TestContext.DataRow[(int)Column.IsValid]; LogonInfo logonInfo = new LogonInfo(userId, "P@ssw0rd"); if (!isValid) { Exception exception = null; try { logonInfo.ChangePassword( "P@ssw0rd", password); } catch (Exception tempException) { exception = tempException; } Assert.IsNotNull(exception, "The expected exception was not thrown."); Assert.AreEqual<Type>( typeof(ArgumentException), exception.GetType(), "The exception type was unexpected."); } else { logonInfo.ChangePassword( "P@ssw0rd", password); Assert.AreEqual<string>(password, logonInfo.Password, "The password was not changed."); } }
娓呭崟 6 絎竴涓渶瑕佹敞鎰忕殑鍦版柟鏄鍔犱簡 DataSourceAttribute灞炴э紝瀹冩寚鏄庝簡榪炴帴瀛楃涓層佽〃鍚嶅拰璁塊棶欏哄簭銆傚湪榪欎釜娓呭崟涓紝鎴戜滑浣跨敤鏁版嵁搴撴枃浠跺悕鏍囪瘑鏁版嵁搴撱傝繖鏍風殑浼樼偣鏄鏂囦歡鍜屾祴璇曢」鐩竴璧瘋縼縐伙紝鍋囪瀹冨彲鑳戒細琚Щ鍔ㄥ埌涓涓浉瀵圭殑璺緞銆?/p>
絎簩涓敞鎰忕殑鍦版柟鏄?TestContext.DataRow璋冪敤銆?b>TestContext鏄湪鎴戜滑榪愯鍒涘緩嫻嬭瘯鍚戝鏃剁敱鐢熸垚鍣ㄦ彁渚涚殑灞炴э紝瀹冨湪榪愯鏃剁敱嫻嬭瘯鎵ц寮曟搸鑷姩璧嬪鹼紝榪欐牱鎴戜滑灝卞彲浠ュ湪嫻嬭瘯涓闂窡嫻嬭瘯鐜鍏寵仈鐨勬暟鎹傚鍥?7 鎵紺恒?/p>
鍥?/b> 7. TestContext 鍏寵仈
濡傚浘 7 鎵紺猴紝TestContext鎻愪緵浜?TestDirectory鍜?TestName鏁版嵁錛屼互鍙?BeginTimer()鍜?b>EndTimer()鏂規硶銆傚 ChangePasswordTest()鏂規硶鏈鏈夋剰涔夌殑鏄?DataRow灞炴с傚洜涓?ChangePasswordTest()鏂規硶鐢?DataSourceAttribute淇グ錛岃灞炴ф寚瀹氱殑琛ㄨ繑鍥炴瘡涓褰曟椂錛岃鏂規硶閮戒細琚皟鐢ㄤ竴嬈°傝繖灝變嬌嫻嬭瘯浠g爜浣跨敤榪愯涓殑嫻嬭瘯鐨勬暟鎹紝鑰屼笖瀵規彃鍏?LongonInfoTest 琛ㄧ殑姣忔潯璁板綍閲嶅鎵ц嫻嬭瘯銆傚鏋滆〃鍖呭惈鍥涙潯璁板綍錛岄偅涔堟祴璇曞皢浼氬垎鍒墽琛屽洓嬈°?/p>
浣跨敤榪欐牱鐨勬暟鎹┍鍔ㄦ祴璇曟柟娉曪紝鍙互寰堝鏄撶殑鎻愪緵棰濆鐨勬祴璇曟暟鎹紝鑰屼笉闇瑕佺紪鍐欎換浣曚唬鐮併備竴鏃﹂渶瑕侀澶栫殑嫻嬭瘯鐢ㄤ緥錛屾垜浠渶瑕佸仛鐨勫氨鏄悜 LongonInfoTest 琛ㄥ鍔犲叧鑱旂殑鏁版嵁銆傚敖綆℃垜浠彲浠ュ垱寤轟袱涓嫭绔嬬殑嫻嬭瘯鏉ヤ嬌鐢ㄥ崟鐙殑琛ㄥ垎鍒祴璇曟湁鏁堝拰鏃犳晥鏁版嵁錛岃繖涓壒瀹氱殑渚嬪瓙鍚堝茍浜嗚繖浜涙祴璇曟潵鏄劇ず紼嶅井澶嶆潅鐨勬暟鎹祴璇曞疄渚嬨?/p>
鐜板湪鎴戜滑宸茬粡鏈変簡嫻嬭瘯錛屾槸鏃跺欎負嫻嬭瘯緙栧啓瀹炵幇浜嗐備嬌鐢?C# 閲嶆瀯宸ュ叿錛屾垜浠彲浠ュ彸閿崟鍑?ChangePassword()鏂規硶璋冪敤錛岄夋嫨鑿滃崟欏?/b>GenerateMethodStub錛岀劧鍚庡浜庣敓鎴愮殑鏂規硶鎻愪緵瀹炵幇錛屼竴鏃︽垜浠垚鍔熷湴榪愯浜嗕嬌鐢ㄦ墍鏈夋祴璇曟暟鎹殑嫻嬭瘯錛屾垜浠篃鍙互寮濮嬮噸鏋勪唬鐮佷簡錛?b>LogonInfo 綾葷殑鏈緇堝疄鐜板娓呭崟 7 鎵紺恒?/p>
娓呭崟 7. LogonInfo 綾?/b>
using System; using System.Text.RegularExpressions; namespace VSTTDemo { public class LogonInfo { public LogonInfo(string userId, string password) { this.UserId = userId; this.Password = password; } private string _UserId; public string UserId { get { return _UserId; } private set { if (value == null || value.Trim() == string.Empty) { throw new ArgumentException( "Parameter userId may not be null or blank."); } _UserId = value; } } private string _Password; public string Password { get { return _Password; } private set { string errorMessage; if (!IsValidPassword(value, out errorMessage)) { throw new ArgumentException( errorMessage); } _Password = value; } } public static bool IsValidPassword(string value, out string errorMessage) { const string passwordSizeRegex = "(?=^.{6,255}$)"; const string uppercaseRegex = "(?=.*[A-Z])"; const string lowercaseRegex = "(?=.*[a-z])"; const string punctuationRegex = @"(?=.*\d)"; const string upperlowernumericRegex = "(?=.*[^A-Za-z0-9])"; bool isValid; Regex regex = new Regex( passwordSizeRegex + "(" + punctuationRegex + uppercaseRegex + lowercaseRegex + "|" + punctuationRegex + upperlowernumericRegex + lowercaseRegex + "|" + upperlowernumericRegex + uppercaseRegex + lowercaseRegex + "|" + punctuationRegex + uppercaseRegex + upperlowernumericRegex + ")^.*"); if (value == null || value.Trim() == string.Empty) { isValid = false; errorMessage = "Password may not be null or blank."; } else { if (regex.Match(value).Success) { isValid = true; errorMessage = ""; } else { isValid = false; errorMessage = "Password does not meet the complexity requirements."; } } return isValid; } public void ChangePassword( string oldPassword, string newPassword) { if (oldPassword == Password) { Password = newPassword; } else { throw new ArgumentException( "The old password was not correct."); } } } }
鍗曞厓嫻嬭瘯鐨勪竴涓叧閿害閲忔槸鍐沖畾鍦ㄥ崟鍏冩祴璇曡繍琛屾椂嫻嬭瘯浜嗗灝戜唬鐮併傝搴﹂噺縐頒負浠g爜瑕嗙洊錛孴eam Test 鍖呭惈浜嗕竴涓唬鐮佽鐩栧伐鍏鳳紝鍙互璇︾粏瑙i噴琚墽琛屼唬鐮佺殑鐧懼垎鐜囷紝騫剁獊鍑烘樉紺哄摢浜涗唬鐮佽鎵ц錛岄偅浜涙病鏈夎鎵ц銆傝鍔熻兘濡傚浘 8 鎵紺恒?/p>
鍥?/b> 8. 紿佸嚭鏄劇ず浠g爜瑕嗙洊
鍥?8 鏄劇ず浜嗚繍琛屾墍鏈夊崟鍏冩祴璇曞悗鐨勪唬鐮佽鐩栫殑紿佸嚭鏄劇ず鎯呭喌銆傜孩鑹茬獊鍑烘樉紺鴻鏄庝簡鎴戜滑鏈変駭鍝佷唬鐮佹病鏈夎繍琛屼換浣曞崟鍏冩祴璇曪紝榪欒鏄庢垜浠紪鍐欒繖浜涗唬鐮佹椂鏈伒寰?TDD 鍘熷垯錛屽嵆鍦ㄧ紪鍐欏疄鐜板墠鍏堟彁渚涙祴璇曘?/p>
涓鑸潵璇達紝嫻嬭瘯綾諱笉浠呭寘鍚嫭绔嬬殑嫻嬭瘯鏂規硶錛岃繕鍖呭惈浜嗕笉鍚岀殑瀵規祴璇曡繘琛屽垵濮嬪寲鍜屾竻闄ょ殑鏂規硶銆傚疄闄呬笂錛屽垱寤烘祴璇曞悜瀵煎湪鍒涘緩 VSTSDemo.Test 欏圭洰鏃訛紝灝嗕竴浜涜繖鏍風殑鏂規硶娣誨姞鍒扮被 LongonInfoTest 涓紝瑙佹竻鍗?8銆?/p>
娓呭崟 8. 鏈緇堢殑 LogonInfoTest 綾?/b>
using VSTTDemo; using Microsoft.VisualStudio.QualityTools.UnitTesting.Framework; using System; namespace VSTSDemo.Test { /// <summary> ///This is a test class for VSTTDemo.LogonInfo and is intended ///to contain all VSTTDemo.LogonInfo Unit Tests ///</summary> [TestClass()] public class LogonInfoTest { private TestContext testContextInstance; /// <summary> ///Gets or sets the test context which provides ///information about and functionality for the ///current test run. ///</summary> public TestContext TestContext { get { return testContextInstance; } set { testContextInstance = value; } } /// <summary> ///Initialize() is called once during test execution before ///test methods in this test class are executed. ///</summary> [TestInitialize()] public void Initialize() { // TODO: Add test initialization code } /// <summary> ///Cleanup() is called once during test execution after ///test methods in this class have executed unless ///this test class' Initialize() method throws an exception. ///</summary> [TestCleanup()] public void Cleanup() { // TODO: Add test cleanup code } // ... [TestMethod] // ... public void ChangePasswordTest() { // ... } } }
鐢ㄤ簬瀵規祴璇曡繘琛岃緗拰娓呴櫎鐨勬柟娉曞垎鍒敱灞炴?TestInitializeAttribute鍜?TestCleanupAttribute淇グ銆傚湪姣忎釜榪欐牱鐨勬柟娉曚腑錛屾垜浠彲浠ュ姞鍏ラ澶栫殑浠g爜錛屽畠浠皢浼氬湪姣忎釜嫻嬭瘯鍓嶆垨鑰呮祴璇曞悗榪愯銆傝繖鎰忓懗鐫鍦ㄦ瘡嬈″搴斾簬 LongonInfoTest 琛ㄧ殑璁板綍鐨?ChangePasswordTest()鎵ц鍓嶏紝Initialize() 鍜?Cleanup() 閮戒細琚墽琛岋紝姣忔 NullUserIdInConstructor鍜?EmptyUserIdInConstructor鎵ц鏃朵篃浼氬彂鐢熷悓鏍風殑鎯呭喌銆傝繖鏍風殑鏂規硶鍙互鐢ㄤ簬鍚戞暟鎹簱涓彃鍏ラ粯璁ょ殑鏁版嵁錛岀劧鍚庡湪嫻嬭瘯瀹屾垚鏃舵竻闄ゆ彃鍏ョ殑鏁版嵁銆備緥濡傦紝鎴戜滑鍙互鍋氬埌鍦?Initialize()涓紑濮嬩竴涓簨鍔★紝鐒跺悗鍦ㄦ竻闄ゆ椂鍥炴粴鍚屼竴涓簨鍔★紝榪欐牱涓鏉ワ紝濡傛灉嫻嬭瘯鏂規硶浣跨敤鐩稿悓鐨勮繛鎺ユ椂錛屾暟鎹姸鎬佷細鍦ㄦ瘡嬈℃祴璇曟墽琛屽畬鎴愭椂鎭㈠鍘熺姸銆傜被浼煎湴錛屾祴璇曟枃浠朵篃鍙互榪欐牱澶勭悊銆?/p>
鍦ㄨ皟璇曟湡闂達紝TestCleanupAttribute淇グ鐨勬柟娉曞彲鑳界敱浜庤皟璇曞櫒鍦ㄦ竻闄ょ殑浠g爜鎵ц鍓嶇粓姝㈣繍琛屻傜敱浜庤繖涓師鍥狅紝鏈濂藉湪璁劇疆嫻嬭瘯鏈熼棿媯鏌ユ竻闄ゆ儏鍐碉紝騫跺湪闇瑕佹椂鍦ㄨ緗祴璇曞墠鎵ц娓呴櫎浠g爜銆傚叧浜庡垵濮嬪寲鍜屾竻闄ょ殑鍏跺畠鍙敤鐨勬祴璇曞睘鎬ф湁 AssemblyInitializeAttribute/AssemblyCleanupAttribute鍜?ClassInitializeAttribute/ClassCleanupAttribute銆傜▼搴忛泦鐩稿叧鐨勫睘鎬у鏁翠釜紼嬪簭闆嗚繍琛屼竴嬈★紝鑰岀被鐩稿叧鐨勫睘鎬у涓涓壒瀹氱殑嫻嬭瘯綾葷殑鍔犺澆榪愯涓嬈°?/p>
鍦ㄧ粨鏉熷墠鎴戜滑鍥為【鍑犵鍗曞厓嫻嬭瘯鐨勬渶浣沖疄璺點傞鍏堬紝TDD 鏄潪甯告湁浠峰肩殑瀹炶返銆傚湪鎵鏈夌幇鏈夌殑寮鍙戞柟娉曚腑錛孴DD 鍙兘鏄騫存潵鏍規湰涓婃敼榪涘紑鍙戜笖鎶曡祫鎴愭湰鏈灝忕殑涓縐嶃傛瘡涓?QA 宸ョ▼甯堥兘浼氬憡璇夋偍錛屽紑鍙戜漢鍛樺湪娌℃湁鐩稿簲鐨勬祴璇曞墠涓嶄細鍐欏嚭鎴愬姛鐨勮蔣浠躲傛湁浜?TDD錛屽疄璺墊槸鍦ㄥ疄鐜板墠緙栧啓嫻嬭瘯錛屽茍涓旂悊鎯蟲儏鍐墊槸錛岀紪鍐欑殑嫻嬭瘯鍙互鎴愪負鏃犻渶浜哄伐鍙備笌鎵ц鐨勬瀯寤鴻剼鏈殑涓閮ㄥ垎銆傞渶瑕佽緇冩潵寮濮嬪吇鎴愪範鎯紝浣嗕竴鏃﹀緩绔嬩範鎯悗錛屼笉浣跨敤 TDD 鏂規硶緙栫爜灝卞儚寮杞︽椂涓嶇郴瀹夊叏甯︿竴鏍楓?/p>
瀵逛簬嫻嬭瘯鏈韓錛屾湁涓浜涢澶栫殑鍘熷垯鍙互甯姪鎴愬姛榪涜嫻嬭瘯錛?/p>
鈥?/td> |
閬垮厤嫻嬭瘯浜х敓渚濊禆鎬э紝榪欐牱嫻嬭瘯闇瑕佹寜鐓х壒瀹氱殑欏哄簭鎵ц銆傛瘡涓祴璇曢兘搴旇鏄嚜娌葷殑銆?/p> |
鈥?/td> |
浣跨敤嫻嬭瘯鍒濆鍖栦唬鐮侀獙璇佹祴璇曟竻闄ゅ凡緇忔垚鍔熸墽琛岋紝濡傛灉娌℃湁鍒欏湪鎵ц嫻嬭瘯鍓嶉噸鏂版墽琛屾竻闄ゃ? |
鈥?/td> |
鍦ㄧ紪鍐欎換浣曚駭鍝佷唬鐮佺殑瀹炵幇鍓嶇紪鍐欐祴璇曘? |
鈥?/td> |
瀵逛簬浜у搧浠g爜涓殑姣忎釜綾誨垱寤轟竴涓祴璇曠被銆傝繖鏍峰彲浠ョ畝鍖栨祴璇曠殑緇勭粐錛屽茍鍙互瀹規槗鍦伴夋嫨鍦ㄤ綍澶勬斁緗瘡涓祴璇曘?/p> |
鈥?/td> |
浣跨敤 Visual Studio 鐢熸垚鍒濆鍖栫殑嫻嬭瘯欏圭洰銆傝繖鏍峰彲浠ュぇ澶у噺灝戞墜宸ヨ緗祴璇曢」鐩茍涓庝駭鍝侀」鐩叧鑱旂殑姝ラ銆? |
鈥?/td> |
閬垮厤鍒涘緩鍏朵粬渚濊禆璁$畻鏈虹殑嫻嬭瘯錛屼緥濡備緷璧栫壒瀹氱殑鐩綍璺緞鐨勬祴璇曘?/p> |
鈥?/td> |
鍒涘緩妯℃嫙瀵硅薄 (mock object) 鏉ユ祴璇曟帴鍙c傛ā鎷熷璞¢氬父鍦ㄩ渶瑕侀獙璇?API 絎﹀悎鎵闇鍔熻兘鐨勬祴璇曢」鐩腑瀹炵幇銆?/p> |
鈥?/td> |
鍦ㄧ戶緇垱寤烘柊鐨勬祴璇曞墠楠岃瘉鎵鏈夋祴璇曡繍琛屾垚鍔熴傝繖鏍峰彲浠ヤ繚璇佸湪鐮村潖浠g爜鍚庣珛鍒昏繘琛屼慨姝c?/p> |
鈥?/td> |
鍙互鏈澶у寲鏃犻渶浜哄伐鍙備笌鎵ц鐨勬祴璇曚唬鐮併傚湪渚濊禆浜庢墜宸ユ祴璇曞墠錛屽繀欏誨畬鍏ㄨ偗瀹氭棤娉曢噰鐢ㄥ悎鐞嗙殑鏃犻渶浜哄伐鍙備笌鎵ц鐨勬祴璇曟柟妗堛? |
鎬葷殑鏉ヨ錛孷STS 鐨勫崟鍏冩祴璇曞姛鑳芥湰韜緢濂界悊瑙c傝屼笖灝界鏈枃娌℃湁鎻愬埌錛屽畠榪樺彲浠ラ氳繃鑷畾涔夋墽琛屽紩鎿庤繘琛屾墿灞曘傛澶栵紝瀹冨寘鍚簡浠g爜瑕嗙洊鍒嗘瀽鐨勫姛鑳斤紝榪欏浜庤瘎浠鋒祴璇曠殑鍏ㄩ潰鎬ч潪甯告湁鐢ㄣ傞氳繃浣跨敤 VSTS錛屾偍鍙互灝嗘祴璇曟暟鐩拰 bug 鏁扮洰鎴栫紪鍐欑殑浠g爜鏁伴噺榪涜鍏寵仈姣旇緝銆傝繖涓洪」鐩殑榪愯鐘跺喌鎻愪緵浜嗗緢濂界殑鎸囨爣銆?/p>
鏈枃浠嬬粛浜員eam Test 浜у搧涓殑鍩烘湰鍗曞厓嫻嬭瘯鍔熻兘錛屼篃鎺㈣浜嗗叧浜庢暟鎹┍鍔ㄦ祴璇曠殑涓浜涙洿鍔犻珮綰х殑鍔熻兘銆傞氳繃寮濮嬪疄璺靛浠g爜榪涜鍗曞厓嫻嬭瘯錛屾偍浼氫負浜у搧鐨勬暣涓敓鍛芥湡寤虹珛涓濂楀疂璐電殑嫻嬭瘯闆嗐俆eam Test 閫氳繃涓?Visual Studio 鐨勫己澶ч泦鎴愬拰鍏跺畠 VSTS 浜у搧綰匡紝浣胯繖涓鍒囧彉寰楀鏄撱?/p>
Mark Michaelis 鍦?Itron 鍏徃鎷呬換杞歡鏋舵瀯甯堝拰璁插笀銆備粬鏇劇粡瀵瑰嚑涓井杞殑浜у搧璁捐榪涜媯鏌ワ紝鍖呮嫭 C# 鍜孷STS銆傜幇鍦ㄤ粬姝e湪鎾板啓鍙﹀涓鏈湁鍏?C# 鐨勪功錛孍ssential C# (Addison Wesley)銆備笉浣跨敤璁$畻鏈烘椂錛屼粬浼氶櫔浼村浜猴紝榪涜鎴峰榪愬姩錛屾垨鑰呰繘琛岀幆鐞冩梾琛屻侻ark Michaelis 浣忓湪 Spokane, WA銆傛偍鍙互閫氳繃 mark@michaelis.net 鍜屼粬鑱旂郴鎴栬呰闂粬鐨勭綉緇滄棩蹇楋細http://mark.michaelis.net銆?/p>
緲昏瘧鑰匧uke鏄井杞叕鍙哥殑杞歡宸ョ▼甯堬紝涔犳儻浣跨敤C++鍜孋#寮鍙戝簲鐢ㄧ▼搴忋傞棽鏆囨椂闂翠粬鍠滄闊充箰錛屾梾娓稿拰鎬鏃ф父鎴忥紝騫朵笖鎰挎剰甯姪MSDN緲昏瘧鏇村鐨勬枃绔犲拰鍏朵粬寮鍙戣呭叡浜傚彲浠ラ氳繃ecaijw@msn.com鑱旂郴浠栥?/p>
鏈枃鍩轟簬 Visual Studio 2005 鐨勯鍙戝竷鐗堟湰銆傛枃涓寘鍚殑鎵鏈変俊鎭潎鏈夊彲鑳藉彉鏇淬?/p>
鏈枃璁ㄨ錛?
鈥?/td> | 鍒嗘瀽鍣ㄧ殑鍐呴儴宸ヤ綔鏂瑰紡 |
鈥?/td> | EPT 鐨勭伒媧誨姛鑳? |
鈥?/td> | 涓涓緵鍒嗘瀽鐨勭ず渚嬪簲鐢ㄧ▼搴?/p> |
浠g爜鍙粠浠ヤ笅浣嶇疆涓嬭澆錛?/b>
EnterprisePerformance.exe (258KB)
蹇熶唬鐮佷粛鐒跺緢鍙楁榪庛傚嵆浣挎垜鐢ㄦ潵閿叆鏈枃鐨勮綆楁満鍏鋒湁瓚沖鐨勮兘鍔涘拰鍐呭瓨錛岃兘澶熷悓鏃舵帶鍒朵竴搴у師瀛愯兘鍙戠數鍘傘佷竴涓伀鏄熸極娓歌鍒掍互鍙婄編鍥借タ閮ㄤ笂絀虹殑絀轟腑浜ら氾紝騫朵笖浠嶇劧鍏鋒湁鍏呰凍鐨勮兘鍔涙潵澶勭悊鏄熼檯鎺㈢儲涓殑 SETI 鏁版嵁鍖咃紝浣嗚繖騫朵笉鎰忓懗鐫寮鍙戜漢鍛樹笉鍐嶉渶瑕佹媴蹇冨叾浠g爜鐨勯熷害鍜屾晥鐜囥傚湪榪囧幓榪涜 Win32廬 鏈満寮鍙戠殑鏃ュ瓙閲岋紝鎴戜滑涓嶄粎闇瑕佹媴蹇冮熷害錛岃屼笖榪樿鎷呭績 PC 騫沖彴涓婇偅浜涗護浜鴻鍘岀殑璁塊棶鍐茬獊錛堝浜庝綘浠繖浜涜佸浼欙紝榪樻湁鈥滃叏灞淇濇姢閿欒鈥濆拰鈥滀笉鍙仮澶嶇殑搴旂敤紼嬪簭閿欒鈥濓級銆傚敖綆℃墭綆′唬鐮佸凡緇忔秷闄や簡鍏朵腑鐨勪竴浜涙媴蹇冿紝浣嗗畠鍙剰鍛崇潃鎮ㄦ墍緇忓巻鐨勯偅浜涙ц兘闂鍙兘姣斾互鍓嶆洿鍔犻毦浠ユ崏鎽搞備富瑕佸師鍥犳槸錛屽湪浣跨敤鎵樼浠g爜鏃訛紝鎴戜滑涓嶅叿鏈夊湪榪涜鏈満寮鍙戞椂鎵鎷ユ湁鐨勭畝渚跨殑榪愯搴撹鍥俱?/p>
鏈夎澶氭錛屽綋鎴戞鍦ㄤ嬌鐢ㄥ鎴風鏃訛紝鎴戜笉鐭ラ亾濡備綍瑙e喅鎭舵х殑鎬ц兘闂銆傚綋鐒訛紝榪欎簺鎬ц兘闂涓嶄細鍑虹幇鍦ㄤ換浣曟祴璇曠郴緇熶腑錛涘畠浠彧浼氬嚭鐜板湪鐪熷疄涓栫晫鐨勭敓浜т腑銆傜敱浜庡叕鍏辮璦榪愯搴?(CLR) 鏄粦鐩掞紝鍥犳濡傛灉鎴戝笇鏈涙壘鍒板湪嫻嬭瘯緋葷粺涓噸澶嶆ц兘闂鐨勬柟娉曪紝鍒欏緢闅鵑嫻嬩細鍙戠敓浠涔堜簨鎯呫傚敖綆″湪甯傚満涓湁涓浜涚涓夋柟鍟嗕笟鎬ц兘宸ュ叿錛屼絾榪欎簺宸ュ叿涓殑澶у鏁伴兘浼氬緋葷粺閫犳垚榪囧鐨勫共鎵幫紝浠ヨ嚦浜庢牴鏈笉鑳借冭檻鍦ㄧ敓浜х郴緇熶腑浣跨敤銆傝繖涔熷氨鏄綋鎴戠湅鍒?Microsoft 灝嗘彁渚涗竴涓叏鏂扮殑鍒嗘瀽鍣?鈥?Enterprise Performance Tool (EPT) 浠ヤ綔涓?Visual Studio廬 2005 Team Developer Edition 鐨勪竴閮ㄥ垎鏃訛紝鎰熷埌濡傛鍏村鐨勫師鍥犮傚畠鏄垜鍙互鐪熸鑰冭檻鍦ㄧ敓浜х郴緇熶腑浣跨敤鐨勭涓涓垎鏋愮郴緇燂紝鍥犱負瀹冩彁渚涗簡涓浜涢潪甯歌交渚跨殑鏀墮泦鎬ц兘鏁版嵁鐨勬墜孌點傚洜涓烘垜鏇劇粡棰嗗榪囦竴縐嶆渶鐣呴攢鐨勫晢涓氬垎鏋愬櫒鐨勫紑鍙戝伐浣滐紝鎵浠ユ垜鑳藉鐞嗚В鍦ㄤ笉浜х敓澶緋葷粺寮閿鐨勬儏鍐典笅鏀墮泦鏈夌敤鍒嗘瀽鏁版嵁鐨勫洶闅劇▼搴︺?/p>
鍦ㄦ湰鏂囦腑錛屾垜灝嗕粙緇?EPT 鐨勫熀鏈師鐞嗭紝騫跺悜鎮ㄨ鏄庡浣曞紑濮嬩嬌鐢ㄥ畠銆傚洜涓哄垎鏋愬櫒鎵鍏鋒湁鐨勫鏉傛э紝鎵浠ュ湪灝嗘潵鏌愪竴鏈熶腑錛屾垜灝嗚璁哄浣曚嬌鐢?EPT 鏉ヨ窡韙偍鍙兘鍦ㄥ悓浜嬬殑浠g爜涓亣鍒扮殑瀹為檯鎬ц兘闂錛堟垜鐭ラ亾鎮ㄧ殑浠g爜闈炲父瀹岀編錛侊級銆傝璁頒綇錛孍PT 姝e鍦ㄦ祴璇曢樁孌碉紙鎴戜嬌鐢ㄧ殑鏄?Burton Beta 1 鍒鋒柊浣嶇増鏈?40607.83錛夛紝騫朵笖鍦ㄨ浜у搧鍙戝竷涔嬪墠錛屽彲鑳戒細瀵?UI 鎴栨煇浜涚壒瀹氭楠よ繘琛屾洿鏀廣傚湪瀵?EPT 榪涜浠嬬粛涔嬪墠錛屾垜甯屾湜鑺辯偣鍎挎椂闂磋皥璁轟竴涓嬪垎鏋愬櫒閫氬父鏄浣曞伐浣滅殑錛屼互渚挎偍鍙互鏇村ソ鍦頒簡瑙f槸浠涔堜嬌 Enterprise Performance Tool 鍙樺緱濡傛涓庝紬涓嶅悓銆?/p>
鍒嗘瀽鍣ㄧ殑鍩烘湰鍘熺悊
鍦ㄦ偍緙栧啓鍒嗘瀽鍣ㄦ椂錛屽彲浠ラ夋嫨涓ょ鏀墮泦鏁版嵁鐨勬柟寮忎腑鐨勪竴縐嶏細鎺㈡祴鍜岄噰鏍楓傝繖涓ょ鏂瑰紡閮藉崄鍒嗘湁鏁堬紝浣嗘槸姣忕鏂瑰紡閮芥湁瀹冪殑鎶樿》鏂規銆傛帰嫻嬪垎鏋愬櫒鏀墮泦鏁版嵁鐨勬柟寮忔槸鍦ㄥ簲鐢ㄧ▼搴忎腑鎻掑叆鎺㈡祴鎴栨寕閽╋紝浠ヤ究鍦ㄧ▼搴忔墽琛岃鎸傞挬鏃跺氨璋冪敤鍒嗘瀽鍣ㄨ繍琛屽簱銆傝鏀劇疆鎺㈡祴錛屽垎鏋愬櫒闇瑕佸湪緙栬瘧姝ラ涓皢搴旂敤紼嬪簭浠〃鍖栵紝閲嶅啓宸茬粡緙栬瘧鐨勪簩榪涘埗鏂囦歡錛屾垨鑰呭嵆鏃跺皢搴旂敤紼嬪簭浠〃鍖栥傝鏌ョ湅鍩轟簬 .NET 鐨勫簲鐢ㄧ▼搴忕殑鎺㈡祴鍒嗘瀽鍣ㄦ柟娉曠ず渚嬶紝璇烽槄璇?Aleksandr Mikunov 鐨勪竴綃囬潪甯稿嚭鑹茬殑鏂囩珷 鈥斺?a target="_blank">Rewrite MSIL Code On the Fly with the .NET Framework Profiling API鈥濓紙璇ユ枃绔犳憳鑷?MSDN廬Magazine 2003 騫?9 鏈堝垔錛夈傚綋鎴戝紑濮嬭璁?EPT 鐨勬椂鍊欙紝鎮ㄥ皢鐪嬪埌瀹冧嬌鐢ㄦ湳璇滀華琛ㄥ寲鈥濇潵琛ㄧず鎺㈡祴鏂規硶銆?/p>
鎺㈡祴鍒嗘瀽鍣ㄦ柟娉曠殑涓昏浼樺娍鍦ㄤ簬錛屽綋搴旂敤紼嬪簭鎵ц鏃訛紝灝嗗緇堣皟鐢ㄦ墍鎻掑叆鐨勬帰嫻嬨傝繖鏍鳳紝鍒嗘瀽鍣ㄨ繍琛屽簱灝嗗榪愯鍏鋒湁瀹屾暣鐨勮璇嗭紝鍥犳鍦ㄧ敓鎴愬叧閿俊鎭紙渚嬪錛屽嚱鏁頒箣闂寸殑鐖跺瓙鍏崇郴錛夋椂鍙互紜繚姝g‘錛屽茍涓斿垎鏋愬櫒鍙互鎶ュ憡瀹岀編鐨勮皟鐢ㄦ爲錛屼互渚挎偍鍙互杞繪澗鎵懼埌鑺辮垂鏈闀挎椂闂寸殑璋冪敤璺緞銆備嬌鐢ㄦ帰嫻嬪垎鏋愬櫒鏃訛紝娌℃湁浠涔堜簨鎯呰兘澶熼樆姝㈠紑鍙戜漢鍛樺彧鍦ㄥ嚱鏁板叆鍙e拰鍑哄彛澶勬彃鍏ユ帰嫻嬨傚彲浠ュ湪婧愪唬鐮佽綰у埆鏀劇疆棰濆鐨勬帰嫻嬶紝浠ヤ究鎮ㄥ鍑芥暟鍏鋒湁瀹屾暣鐨勮璇嗐?/p>
浣嗘槸錛屾帰嫻嬪垎鏋愬櫒鎵鎻愪緵鐨勮緇嗚鍥懼叿鏈変竴浜涚己鐐廣傜涓涓己鐐規槸浠〃鍖栨柟妗堜嬌鐢ㄨ搗鏉ュ彲鑳藉緢楹葷儲錛屽茍涓斿洜涓哄畠鏄湪浜岃繘鍒剁駭鍒噸鍐欙紝鍥犳瀛樺湪寰堝鍙兘寮曞叆娼滃湪閿欒鐨勯鍩熴傛濡傛偍鍙互鎯沖儚鍒扮殑閭f牱錛岃繖浜涙帰嫻嬭繕鍗犵敤浜嗙┖闂達紝浠庤屽鑷翠竴浜涗唬鐮佽啫鑳鍜岃緝浣庣殑鎬ц兘銆傚浜庡畬鍏ㄤ華琛ㄥ寲鐨勫簲鐢ㄧ▼搴忥紝鎺㈡祴鍒嗘瀽鍣ㄥ彲鑳戒細瀵艱嚧閫熷害澶у箙搴︿笅闄嶏紝浠ヨ嚦浜庡嚑涔庝笉鍙兘鍦ㄧ敓浜х郴緇熶笂榪愯浠〃鍖栫殑浜岃繘鍒舵枃浠訛紝浠庤屼嬌鎮ㄥ湪鏈闇瑕佽鍒嗘瀽鍣ㄧ殑鏃跺欏嵈鏃犳硶鍒╃敤瀹冦?/p>
姝e鍏跺悕縐版墍鏆楃ず鐨勯偅鏍鳳紝閲囨牱鍒嗘瀽鍣ㄦ寜鐓ч鍏堝畾涔夌殑鏃墮棿闂撮殧鑾峰緱搴旂敤紼嬪簭涓鍦ㄦ墽琛岀殑鎿嶄綔鐨勫揩鐓с傚ぇ澶氭暟寮鍙戜漢鍛橀兘娌℃湁鎰忚瘑鍒?Microsoft 鎬繪槸鍦ㄤ粬浠殑寮鍙戠幆澧冧腑闅忛檮浜嗕竴涓噰鏍峰垎鏋愬櫒銆傚畠琚О涓鴻皟璇曞櫒錛?濡傛灉鎮ㄥ紑濮嬭皟璇曞簲鐢ㄧ▼搴忥紝騫朵笖姣忛殧 30 縐掑乏鍙沖氨涓柇鑷寵皟璇曞櫒錛屽垯鎮ㄥ彲浠ユ敞鎰忓埌搴旂敤紼嬪簭綰跨▼姝e湪浣曞鎵ц錛屼互渚垮緢濂藉湴浜嗚В搴旂敤紼嬪簭鍦ㄤ竴嬈¤繍琛岃繃紼嬩腑鎵ц浜嗗摢浜涙搷浣溿傛垜宸茬粡閫氳繃鎵嬪姩瀹屾垚閲囨牱鍒嗘瀽鍣ㄧ殑宸ヤ綔錛岃В鍐充簡寰堝鐢熶駭鎬ц兘闂銆?/p>
浣塊噰鏍峰垎鏋愬櫒濡傛鏈変環鍊肩殑鍘熷洜鍦ㄤ簬錛屽畠浠叿鏈夋瘮鎺㈡祴鍒嗘瀽鍣ㄥ皬寰楀鐨勭郴緇熷紑閿銆傝繖鎰忓懗鐫錛屾偍鍙互鏈夋洿楂樼殑鏈轟細鍦ㄧ敓浜х郴緇熶腑浣跨敤瀹冧滑錛岃屼笉浼氫嬌鏈嶅姟鍣ㄧ柌浜庡鍛戒互鑷充簬鍋滄満銆傞噰鏍峰垎鏋愬櫒鐨勯棶棰樺湪浜庯紝浠庡簲鐢ㄧ▼搴忎腑鑾峰緱鐨勬墍鏈夋牱鏈緢鏈夊彲鑳芥牴鏈笉鏄劇ず浠諱綍浠g爜銆備緥濡傦紝濡傛灉鎮ㄥ叿鏈夊ぇ閲忎嬌鐢ㄦ暟鎹簱鐨勫簲鐢ㄧ▼搴忥紝鍒欐墍鏈夋牱鏈兘鍙互鏉ヨ嚜鏁版嵁搴撹闂▼搴忛泦鐨勫唴閮ㄣ傛渶鍚庯紝鍙姄鍙栨瘡涓嚎紼嬬殑褰撳墠鎵ц鎸囦護鐨勪紶緇熼噰鏍峰垎鏋愬櫒浼氫嬌寰楃‘瀹氭柟娉曚箣闂寸殑鐖跺瓙鍏崇郴鍙樺緱鍗佸垎鍥伴毦錛屽洜鑰岀‘瀹氭ц兘鏈宸殑鎵ц浠g爜閫斿緞瑕佸洶闅懼緱澶氥?/p>
Enterprise Performance Tool 鐨勫熀鏈師鐞?/p>
鍦ㄤ簡瑙e垎鏋愬櫒鐨勬搷浣滄柟寮忎箣鍚庯紝鎴戝氨鍙互璁ㄨ EPT 鎵閲囧彇鐨勬柟寮忎簡銆傜畝鍗曞湴璇達細瀹冩棦鏄噰鏍峰垎鏋愬櫒錛屽張鏄帰嫻嬪垎鏋愬櫒錛圡icrosoft 縐頒箣涓衡滀華琛ㄥ寲鈥濓級銆傚叾鎬濇兂鏄紝鎮ㄥ湪寮濮嬫椂灝嗛氳繃閲囨牱鍒嗘瀽鍣ㄦ潵鏌ョ湅搴旂敤紼嬪簭鎬ц兘錛屼互鑾峰緱甯歌鎬ц兘鐗瑰緛錛屼互渚挎偍鍙互寮濮嬪皢娉ㄦ剰鍔涢泦涓簬搴旂敤紼嬪簭鐨勭儹鐐歸棶棰樹笂銆傚湪鎮ㄤ簡瑙e叿鏈変竴浜涢棶棰樼殑紼嬪簭闆嗕箣鍚庯紝灝卞彲浠ユ眰鍔╀簬浠〃鍖栧垎鏋愪互鏌ョ湅鐗瑰畾鐨勯棶棰橀鍩燂紝浠ヤ究淇瀹冧滑銆傚綋鐒訛紝濡傛灉鎮ㄨ鎵ц鍗曞厓鎬ц兘嫻嬭瘯錛屽垯娌℃湁浠涔堣兘澶熼樆姝㈡偍鐩存帴杞埌瀵圭壒瀹氭ā鍧楄繘琛屼華琛ㄥ寲錛屼互渚垮湪鑱氱劍鏂規涓煡鐪嬪畠浠殑鎬ц兘銆?/p>
浣?EPT 閲囨牱鍒嗘瀽鍣ㄦ湁瓚g殑閮ㄥ垎鍘熷洜鍦ㄤ簬錛屾偍鍙互浣跨敤澶ч噺欏圭洰鏉ヨЕ鍙戞牱鏈傞粯璁ょ殑閲囨牱鐐規槸鏃墮挓鍛ㄦ湡錛屽茍涓斿彲鑳芥槸鎮ㄦ繪槸浣跨敤鐨勯噰鏍風偣銆傞粯璁ゆ儏鍐典笅錛屾瘡涓鐧句竾涓椂閽熷懆鏈熼噰鏍蜂竴嬈★紝浣嗘槸鎮ㄥ彲浠ュ皢閲囨牱闂撮殧鐨勬椂閽熷懆鏈熸暟鏇存敼涓烘偍鍠滄鐨勪換浣曞鹼紝鍙槸璇ュ艱秺灝忥紝EPT 鎵瀵艱嚧鐨勭郴緇熷紑閿灝辮秺澶с傚浜庣敓浜ф湇鍔″櫒錛屾偍鍙互灝嗚鏁板瓧璁劇疆涓烘煇涓潪甯擱珮鐨勬暟瀛楋紙濡備簲鐧句竾錛夛紝浠ヤ嬌緋葷粺寮閿淇濇寔鍦ㄥ悎鐞嗙殑姘村鉤錛屽悓鏃朵笉浼氬畬鍏ㄧ牬鍧忚繘紼嬩腑鐨勫彲鐢ㄦс傛濡傛偍棰勬枡鐨勯偅鏍鳳紝姣忎簲鐧句竾涓椂閽熷懆鏈熼噰鏍蜂竴嬈″皢鎰忓懗鐫鎮ㄩ渶瑕佷嬌搴旂敤紼嬪簭榪愯鐩稿綋闀跨殑鏃墮棿錛屼互渚垮湪鎮ㄧ殑鐑偣鍖哄煙涓幏寰楄壇濂界殑鏍鋒湰鍒嗗竷銆?/p>
濡傛灉鎮ㄧ殑搴旂敤紼嬪簭浣跨敤浜嗗緢澶氬唴瀛橈紝鍒欏彲浠ラ夋嫨璁?EPT 閲囨牱鍒嗘瀽鍣ㄦ敼涓哄湪鍑虹幇欏甸敊璇椂瑙﹀彂銆傝繖鏍鳳紝鎮ㄥ氨鍙互鍦ㄦ暟鎹浜ゆ崲鍑?RAM 鏃惰幏寰楁ц兘蹇収錛屽茍涓斿彲浠ョ湅鍒版槸璋佸湪鎵ц鎺ㄩ佹搷浣溿傚鏋滃垵濮嬪垎鏋愬櫒榪愯琛ㄦ槑鎮ㄥ湪浠g爜澶栭儴鐨勫尯鍩熶腑鑺辮垂浜嗗ぇ閲忔椂闂達紝鍒欏彲浠ュ憡璇夊垎鏋愬櫒鏀逛負鍩轟簬緋葷粺璋冪敤鏉ュ畬鎴愰噰鏍楓傚鏋滄偍瑕佸垎鏋愬叿鏈夊ぇ閲忕嚎紼嬬殑澶氱嚎紼嬪簲鐢ㄧ▼搴忥紝鍒欒閲囨牱緇熻淇℃伅浼氬鎮ㄥ湪浠庣敤鎴鋒ā寮忚漿鎹㈠埌鍐呮牳妯″紡錛堣繖琛ㄦ槑鏌愪簺綰跨▼鍙兘浼氫笉蹇呰鍦板湪鍐呮牳瀵硅薄涓婇樆濉烇級鏃剁殑鏁版嵁榪涜鎷嶇収銆傛偍鍙互鐢ㄤ簬閲囨牱瑙﹀彂鍣ㄧ殑鏈鍚庝竴浜涘兼槸 CPU 鎵鏀寔鐨勫悇縐嶆ц兘璁℃暟鍣紝渚嬪錛屽垎鏀鏁版垨緙撳瓨涓㈠け銆傝繖鏄竴涓彧鏈夋瀬灝戞暟浜烘墠紜疄闇瑕佺殑楂樼駭閫夐」錛屼絾鏄鏋滄偍紜疄闇瑕佽鏁版嵁錛岄偅涔堢煡閬撹鏁版嵁瀛樺湪涔熶笉閿欍?/p>
閭d簺蹇欑鐨?Redmontonian 榪樿В鍐充簡璋冪敤鍫嗘爤闂 鈥?榪欐槸瀵規湁鐢ㄧ殑閲囨牱鍒嗘瀽鍣ㄩ犳垚闅滅鐨勬渶澶ч棶棰樹箣涓銆傛濡傛垜鍦ㄥ墠闈㈡彁鍒扮殑閭f牱錛屽ぇ澶氭暟閲囨牱鍒嗘瀽鍣ㄥ湪閲囨牱鏃跺彧鏄褰撳墠姝e湪鎵ц鐨勬寚浠よ繘琛屾媿鐓с侻icrosoft 瑙e喅浜嗗浣曞皢鏋佸揩鐨勫爢鏍堥亶鍘嗙粨鍚堝埌浠栦滑鐨勯噰鏍峰垎鏋愬櫒閮ㄥ垎涓紝浠ヤ究鎮ㄨ兘澶熻幏寰楁牱鏈殑濂藉錛屽茍涓旂煡閬撳湪鎵ц璇ユ牱鏈椂鏄浣曞埌杈鵑偅閲岀殑銆傝繖浣垮緱灝嗚繖浜涘揩鐓т笌浠g爜閲嶆柊鍏寵仈鍙樺緱鏇村姞瀹規槗銆?/p>
鍦ㄨ璁烘偍鍙互鍒嗘瀽鐨勫簲鐢ㄧ▼搴忎箣鍓嶏紝鎴戞兂鎻愬嚑浠舵偍寰堝彲鑳借寰楁湁瓚g殑浜嬫儏銆傜涓浠朵簨鎯呮槸錛屽鏋滄偍璁や負 Microsoft 鏄粠澶村紑鍙戣鎬ц兘宸ュ叿鐨勶紝閭d箞鎮ㄥ彧鐚滃浜嗕竴鍗娿傚湪 Microsoft 鍐呴儴錛屽紑鍙戝洟闃熶竴鐩村湪浣跨敤 EPT 鐨勫墠韜紙鍚嶄負 Call Attribute Profiler (CAP)錛屽畠浣跨敤浠〃鍖栵級鍜?Low Overhead Profiler (LOP) 鈥?涓涓噰鏍峰垎鏋愬櫒銆傜敱浜?Microsoft 寮鍙戜簡榪欎簺宸ュ叿浠ユ敹闆嗘湁鍏沖簲鐢ㄧ▼搴忥紙渚嬪錛屾搷浣滅郴緇熷拰鏁翠釜 Office 濂椾歡錛夌殑鎬ц兘淇℃伅錛屽洜姝ゅ畠浠敋鑷充笉浼氱粰鎮ㄧ殑搴旂敤紼嬪簭甯︽潵浠涔堣礋鎷呫傛垜鏇劇粡浣跨敤榪?EPT 鐨勫墠韜紝鎵浠ユ垜鍙互鍛婅瘔鎮ㄥ叕鍏辯増鏈嬌鐢ㄨ搗鏉ヤ細瀹規槗澶氬皯銆傛澶栵紝瀹冧滑榪樺叿鏈変竴浜涙瀬涓烘湁瓚g殑鍔熻兘錛堢◢鍚庢垜灝嗕簣浠ヨ璁猴級銆?/p>
絎簩涓湁瓚g殑浜嬮」涓?EPT 鎵鏀寔鐨勬妧鏈湁鍏熾傚敖綆℃煇浜涗漢鍙兘璁や負鐢變簬 Microsoft 闈炲父鍋忛噸浜?.NET Framework錛屽洜姝ゆ棤娉曞皢 EPT 鐢ㄤ簬 Win32 搴旂敤紼嬪簭鎴栨湰鏈轟唬鐮侊紝浣?EPT 鍥㈤槦瀹為檯涓婂凡緇忔壙璇烘敮鎸佹墍鏈夌殑 Win32 鏈満搴旂敤紼嬪簭浠ュ強 .NET 浠g爜銆傝繖鎰忓懗鐫錛屾棤璁烘偍浣跨敤鍝鎶鏈紙ASP.NET銆乄indows廬 紿椾綋銆丮FC 鎴?Win32 鏈嶅姟錛夛紝鎮ㄩ兘鍏鋒湁瀹屽叏鐨勯噰鏍峰拰浠〃鍖栨敮鎸併傛偍灝嗙湅鍒幫紝鍦?Visual Studio .NET 涓紝璺ㄦ妧鏈嬌鐢?EPT 娌℃湁浠諱綍宸紓銆?/p>
瀹為檯鐨?EPT 璁劇疆闈炲父騫沖父錛涘彧闇浠?Visual Studio .NET 瀹夎紼嬪簭鐨勨淓nterprise Tools鈥濇爲鎺т歡涓夋嫨鈥淓nterprise Performance Tool鈥濆嵆鍙傚綋鐒訛紝鍥犱負鎮ㄧ煡閬?EPT 浠嶇劧鏄竴涓祴璇曚駭鍝侊紝鎵浠ユ偍鐨勭涓涓弽搴斿彲鑳芥槸榪愯铏氭嫙 PC錛屽茍鍦ㄩ偅閲屽畨鍏ㄥ湴鍖呭惈鎵鏈夊唴瀹廣備絾鏄紝涓轟簡鎵ц閲囨牱鍒嗘瀽錛孍PT 浣跨敤鍐呮牳妯″紡璁懼椹卞姩紼嬪簭鏉ュ搷搴?CPU 鎬ц兘璁℃暟鍣ㄤ腑鏂紝涓嶈繃浠や漢閬楁喚鐨勬槸錛岃櫄鎷?PC 娌℃湁瀹炵幇璁℃暟鍣ㄣ傚畠涔熸病鏈夋ā鎷熼珮綰у彲緙栫▼涓柇鎺у埗鍣?(APIC)錛岃岃繖涓よ呴兘鏄唴鏍歌澶囬┍鍔ㄧ▼搴忓畬鎴愬叾宸ヤ綔鎵蹇呴渶鐨勩傚ソ娑堟伅鏄紝濡傛灉鎮ㄦ病鏈夐澶栫殑璁$畻鏈轟互渚垮畨瑁?EPT錛岄偅涔堟偍涔熷茍闈炲畬鍏ㄤ笉騫革紝鍥犱負浠〃鍒嗘瀽鍣ㄤ粛鐒惰兘澶熷伐浣溿傚鏋滄偍娌℃湁澶氫綑鐨勮綆楁満浠ヤ究瀹夎 EPT錛岄偅涔堣繖鏄竴涓鍏徃涓烘偍璐拱鍙︿竴鍙拌綆楁満鐨勫ソ鍊熷彛銆?/p>
Animated Algorithm
瑕佸涔犱換浣曞伐鍏風殑鐢ㄦ硶錛屾偍閮介渶瑕佷竴涓悎閫傜殑紺轟緥搴旂敤紼嬪簭錛屼互渚胯兘澶熸渶浣沖湴鍒╃敤璇ュ伐鍏楓傚湪嫻嬭瘯鍛ㄦ湡鐨勮繖涓鏃跺埢錛孍PT 娌℃湁闅忛檮浠諱綍紺轟緥錛屼絾鏄湪鎴戠殑紜洏涓婂凡緇忔湁浜嗕竴涓畬緹庣殑鍒嗘瀽鍣ㄧず渚嬨傛棭浜涙椂鍊欙紝鎴戞鍦ㄥ皾璇曡В鍐沖浣曞湪 Windows 紿椾綋搴旂敤紼嬪簭涓嬌鐢ㄥ綰跨▼鐨勯棶棰橈紝鍥犳鎴戠紪鍐欎簡涓涓悕涓?Animated Algorithm 鐨勪簡涓嶈搗鐨勫皬紼嬪簭錛岃紼嬪簭鍙疄鏃舵縺媧誨ぇ閲忔帓搴忕畻娉曘?b>鍥?1 鏄劇ず鎴戠殑紺轟緥搴旂敤紼嬪簭宸茬粡鍑嗗濂芥帓搴忋?/p>
鍥?1 姝e湪宸ヤ綔鐨?Animated Algorithm
Animated Algorithm 浣挎偍鍙互鍦ㄧ獥浣撶殑緇勫悎妗嗕腑錛屼粠 15 涓笉鍚岀殑鎺掑簭綆楁硶涓繘琛岄夋嫨銆傗淥ptions鈥濊彍鍗曚嬌鎮ㄥ彲浠ラ夋嫨鍚勪釜鍏冪礌浜ゆ崲鎴栬緗箣闂寸殑浼戠湢鏃墮棿錛屼互渚挎偍鍙互闄嶄綆鍥懼艦鏇存柊鐨勯熷害銆?/p>
鎴戜笉涔呭墠浣跨敤 Microsoft廬 .NET Framework 鐗堟湰 1.1 緙栧啓浜?Animated Algorithm錛屽洜姝ゆ偍涓嶄細鍦ㄤ唬鐮佷腑鎵懼埌浠諱綍濂囩壒鐨勬硾鍨嬫垨鏂扮殑 BackgroundWorker 欏廣侼SORT 紼嬪簭闆嗕腑鐨勬帓搴忕畻娉曟潵鑷敱 Jonathan de Halleux銆丮arc Clifton 鍜?Robert Rohde 寮犺創鍒?The Code Project 涓婄殑涓綃囦紭縐鏂囩珷錛堣鍙傞槄 Sorting Algorithms In C#錛夛紝璇ョ▼搴忛泦灝嗙畻娉曞皝瑁呭埌鍏叡緇撴瀯涓紝浠ヤ究鎮ㄥ彲浠ヨ交鏉懼湴鏇挎崲鎵ц鍏冪礌浜ゆ崲鍜岃緗殑綾匯傚洜涓哄畠浠叿鏈夐潪甯稿ソ鐨勪綋緋葷粨鏋勶紝鎵浠ユ垜闇瑕佸叧蹇冪殑鎵鏈夊唴瀹逛負 UI 閮ㄥ垎銆?/p>
鍦ㄦ湰鏂囩殑鍏朵綑閮ㄥ垎涓紝鎴戝皢鍒嗘瀽 Animated Algorithm 紼嬪簭銆傚鏋?EPT 鍥㈤槦灝嗚紼嬪簭浣滀負紺轟緥搴旂敤紼嬪簭闅忛檮鍦ㄤ駭鍝佷腑錛屽垯浼氶潪甯告銆傦紙鍝堝搱銆傦級
EPT 鍏ラ棬
鍦?Visual Studio 2005 Beta 1 涓紝鍦ㄥ摢閲屽彲浠ユ壘鍒?EPT 褰撶劧鏄笉鏄庢樉鐨勩侲PT 鍦ㄦ偍鍚姩 Performance Wizard錛堝畠浣嶄簬鈥淭ools鈥濊彍鍗曚笅錛夋椂鍚姩錛屽茍涓旀棤璁烘槸鍚︽墦寮欏圭洰錛屽畠閮藉瓨鍦ㄣ傝璁頒綇錛孭erformance Wizard 鎵鍒涘緩鐨勬ц兘浼氳瘽涓嶆槸欏圭洰鐨勪竴閮ㄥ垎錛涘畠浠疄闄呬笂鏄叿鏈夎嚜宸辯殑 IDE 紿楀彛錛堢О涓?Performance Explorer錛夌殑鍗曠嫭鏂囦歡銆傛偍鍙互閫氳繃浠庘淔ile鈥潀鈥淥pen鈥濆璇濇涓夋嫨 PSESS 鏂囦歡錛屾潵鎵撳紑鎮ㄥ垱寤虹殑鎬ц兘浼氳瘽銆?/p>
濡傛灉鎮ㄥ湪鍗曟鎵ц Performance Wizard 鏃舵病鏈夋墦寮欏圭洰錛屽垯鎵浜х敓鐨勬ц兘浼氳瘽灝嗕笌鎮ㄦ寚瀹氱殑浜岃繘鍒舵枃浠剁浉鍏寵仈銆備絾鏄紝鍦ㄦ祴璇曠増涓紝鍦ㄦ偍鎸囧畾瑕佽繍琛岀殑浜岃繘鍒舵枃浠舵椂錛屽繀欏繪墦寮鍏寵仈鐨勯」鐩傛垜鍙槸鎯抽『渚挎彁涓涓嬭繖涓皬灝忕殑鎶宸э紝鍥犱負褰撴垜絎竴嬈¢亣鍒拌闂鏃訛紝瀹冪‘瀹炶鎴戝洶鎯戜笉宸層?/p>
鍦ㄦ偍鍚姩 Performance Wizard 浠ュ悗錛屽憟鐜板湪鎮ㄩ潰鍓嶇殑絎竴涓睆騫曡姹傛偍閫夋嫨瑕佸垎鏋愮殑搴旂敤紼嬪簭銆傚鏋滄偍鎵撳紑浜嗕竴涓彲鐢熸垚澶氫釜紼嬪簭闆嗙殑欏圭洰錛堝 Animated Algorithm錛夛紝鍒欏彧鑳戒粠璇ュ悜瀵間腑閫夊彇涓涓▼搴忛泦銆傚鏋滆榪涜閲囨牱錛屽垯鍙夊彇榪欎竴涓▼搴忛泦鏄緢濂界殑錛屽洜涓?EPT 閲囨牱浼氬垎鏋愬姞杞界殑鎵鏈夌▼搴忛泦錛堝寘鎷偅浜涙潵鑷鏋剁被搴撶殑紼嬪簭闆嗭級銆備絾鏄紝濡傛灉鎮ㄨ瀵瑰涓▼搴忛泦鎵ц浠〃鍖栧垎鏋愶紝鍒?Performance Wizard 鍙夋嫨榪欎竴涓▼搴忛泦錛屽洜姝ゆ偍灝嗛渶瑕佸湪 Performance Explorer 涓墍鐢熸垚鐨勬ц兘浼氳瘽涓寚瀹氬叾浠栭」鐩垨紼嬪簭闆嗐傜◢鍚庢垜灝嗗悜鎮ㄨ鏄庡浣曞畬鎴愯宸ヤ綔銆?/p>
鍦ㄩ夋嫨浜嗚鍦ㄦц兘浼氳瘽涓嬌鐢ㄧ殑紼嬪簭闆嗘垨欏圭洰涔嬪悗錛屾偍蹇呴』閫夊彇鍒嗘瀽鏂規硶銆傚湪 Performance Explorer 涓殑浠諱綍浣嶇疆錛屾偍閮藉彲浠ュ湪閲囨牱鍜屼華琛ㄥ寲涔嬮棿鍒囨崲錛屼互婊¤凍鑷繁鐨勯渶瑕侊紱鎮ㄥ湪璇ュ悜瀵奸〉涓繘琛岀殑閫夋嫨鍙〃紺烘偍鏈鍒濆笇鏈涙墽琛岀殑鎿嶄綔銆傚湪閫夋嫨浜嗗垎鏋愭柟娉曚箣鍚庯紝鍚戝灝卞熀鏈畬鎴愪簡銆傚浜?EPT 鐨勬渶緇堢増鏈紝鎮ㄥ皢鍦?Performance Wizard 涓叿鏈夌敤浜庢寚瀹氶檮鍔犱俊鎭殑鏇村閫夐」銆傛渶緇堢増鏈繕灝嗕嬌鎮ㄥ彲浠ョ洿鎺ヤ粠 Performance Explorer 涓垱寤烘ц兘浼氳瘽銆?/p>
鍥?2 鏄劇ず浜?Performance Explorer 鍦ㄥ垰鍒氬畬鎴?Performance Wizard 姝ラ浠ュ垱寤?AnimatedAlgorithms 欏圭洰鐨勪華琛ㄥ寲榪愯涔嬪悗鐨勭獥鍙c傝娣誨姞鍙︿竴涓」鐩殑杈撳嚭浜岃繘鍒舵枃浠訛紝璇峰彸閿崟鍑燴淭argets鈥濇枃浠跺す錛岀劧鍚庝粠涓婁笅鏂囪彍鍗曚腑閫夋嫨鈥淎dd Target Project鈥濄傚鏋滆娣誨姞涓庤欏圭洰娌℃湁鍏寵仈鐨勭壒瀹氫簩榪涘埗鏂囦歡錛岃閫夋嫨鍙︿竴涓夐」 鈥斺淎dd Target Binary鈥濄傚鏋滄偍宸茬粡閫夋嫨浜嗏淎dd Target Project鈥濓紝鍒欏彲浠ュ湪浜х敓鐨勫璇濇涓粠宸叉墦寮鐨勮В鍐蟲柟妗堜腑閫夋嫨鍏朵粬欏圭洰銆?/p>
鍥?2 Performance Explorer
濡傛灉鎮ㄥ凡緇忛夋嫨浜嗕華琛ㄥ寲榪愯錛堝畠鐢辯豢鑹插惎鍔ㄧ澶翠笅闈㈢殑涓嬫媺鍒楄〃妗嗕腑鐨勬枃鏈〃紺猴級錛屽垯浜岃繘鍒舵枃浠朵華琛ㄥ寲灝嗗湪紼嬪簭鎵ц涔嬪墠鍙戠敓銆傚鏋滄偍涓嶅笇鏈涢拡瀵硅繍琛屼華琛ㄥ寲鏌愪釜鐗瑰畾鐨勪簩榪涘埗鏂囦歡錛屽垯璇峰彸閿崟鍑昏浜岃繘鍒舵枃浠訛紝騫跺彇娑堥変腑鈥淚nstrument Binary鈥濊彍鍗曢夐」銆?/p>
濡傛灉鎮ㄥ凡緇忛夋嫨浜嗛噰鏍峰垎鏋愶紝騫朵笖甯屾湜闄勫姞鍒版煇涓鍦ㄨ繍琛岀殑欏圭洰錛屽垯鍗曞嚮鈥淎ttach/Detach鈥濇寜閽紙鈥淪tart鈥濇寜閽彸渚х殑鏂滃悜綆ご錛夊皢鍛堢幇鈥淎ttach Profiler to Process鈥濆璇濇銆傞氳繃 EPT錛屾偍鍙互鏍規嵁闇瑕侀檮鍔犲埌浠繪剰澶氱殑榪涚▼錛屼互渚胯幏寰楀搴旂敤紼嬪簭鐨勮璇嗐傗淎ttach Profiler to Process鈥濆璇濇榪樺厑璁告偍浠庣壒瀹氱殑浜岃繘鍒舵枃浠朵腑鍒嗙鍒嗘瀽銆傚湪灝嗘潵鐨勬煇涓鏈?MSDN Magazine 涓紝鎴戝皢鏇磋緇嗗湴璁ㄨ濡備綍闄勫姞鍒扮幇鏈夌殑榪涚▼錛堢壒鍒槸涓轟簡榪涜 ASP.NET 鎬ц兘璋冩暣錛夈?/p>
Performance Explorer 紿楀彛欏墮儴鐨勬渶鍚庝竴涓寜閽槸鏃犳墍涓嶅湪鐨勨淧roperties鈥濇寜閽傚湪鍚姩鍒嗘瀽榪愯涔嬪墠錛屾偍鍙兘甯屾湜嫻忚涓涓嬫ц兘浼氳瘽灞炴э紝浠ヨ緗嚑涓叧閿睘鎬с傜涓涓睘鎬т綅浜庘淕eneral鈥濋夐」鍗′笂錛屽畠鏄偍甯屾湜涓烘ц兘浼氳瘽瀛樺偍鎬ц兘鎶ュ憡鐨勪綅緗傚湪鍒嗘瀽欏圭洰鏃訛紝榛樿璁劇疆鏄皢鎶ュ憡瀛樺偍鍦ㄤ笌瑙e喅鏂規鐩稿悓鐨勭洰褰曚腑銆備絾鏇村ソ鐨勫仛娉曟槸灝嗘ц兘浼氳瘽鍜屽畠浠殑鐩稿簲鎶ュ憡鏀劇疆鍦ㄥ畠浠嚜宸辯殑鐩綍涓紝浠ヤ究鎮ㄥ彲浠ユ洿瀹規槗鍦板瓨鍌ㄧ壒瀹氱殑榪愯闆嗐傝繖鏍瘋繕鍙互鏇村鏄撳湴鍒嗘瀽涔嬪墠鍜屼箣鍚庣殑鎯呭喌錛屼互渚挎煡鐪嬫偍鎵榪涜鐨勪唬鐮佹洿鏀圭殑褰卞搷銆?/p>
鍦ㄢ淕eneral鈥濋夐」鍗′笂錛屾偍榪樺彲浠ュ湪浠〃鍖栧拰閲囨牱鍒嗘瀽涔嬮棿鍒囨崲錛堣繖浼氭洿鏀瑰湪 Performance Explorer 涓樉紺虹殑鍊鹼級銆傚湪鎴戣繘琛岀殑鎬ц兘璋冩暣涓紝鎴戝枩嬈㈠皢鐗瑰畾鐨勪細璇濅笓鐢ㄤ簬鍗曚釜綾誨瀷鐨勫垎鏋愶紝浠ラ伩鍏嶅嚭鐜頒笌鎶ュ憡鏈夊叧鐨勬販娣嗐傛病鏈変換浣曚簨鎯呴樆姝㈡偍涓烘墍鏈夌綾葷殑鐗瑰畾鏂規錛堟兜鐩栦粠鍒嗘瀽綾誨瀷鍒板崟涓簩榪涘埗鏂囦歡浠〃鍖栫殑鎵鏈夋柟妗堬級鍒涘緩鏁頒互鐧捐鐨勪笉鍚屾ц兘浼氳瘽鏂囦歡銆傛垜榪樺皢鎻愪竴涓嬧淕eneral鈥濋夐」鍗′笂鐨勬渶鍚庝竴涓」錛屽畠鍏鋒湁涓涓潪甯歌浜虹殑鍚嶇О 鈥斺淢anaged Allocation Profiling鈥濓紝鐩鎬俊榪欎細浣挎偍鎰熷埌鏇村姞濂藉銆傚湪鎴戣璁哄畬甯歌鍒嗘瀽涔嬪悗錛屾垜灝嗚繑鍥炲埌璇ラ」銆?/p>
鈥淧erformance Session鈥濆睘鎬ч〉涓婄殑鍙︿竴涓湁瓚g殑閫夐」鍗℃槸鈥淪ampling鈥濋夐」鍗★紙璇峰弬瑙?b>鍥?3錛夈傚湪榪欓噷錛屾偍鍙互鍛婅瘔 EPT 鎮ㄨ鎵ц鍝綾誨瀷鐨勯噰鏍楓傛濡傛垜鍦ㄥ墠闈㈡彁鍒扮殑閭f牱錛屾偍瀵逛簬甯屾湜濡備綍榪涜閲囨牱鍏鋒湁闈炲父濂界殑鎺у埗銆?/p>
鍥?3 鍚勭 EPT 閲囨牱璁℃暟鍣ㄩ夐」
鍦ㄦ墽琛屽垎鏋愯繍琛屾椂錛孍PT 浼氬湪浜岃繘鍒舵枃浠跺湪紜洏涓墍澶勭殑浣嶇疆涓婂皢鍏朵華琛ㄥ寲銆傚鏋滄偍甯屾湜灝嗕華琛ㄥ寲鐨勪簩榪涘埗鏂囦歡縐誨姩鍒板彟涓涓綅緗紝璇烽夋嫨鈥淧erformance Session鈥濆睘鎬ч〉涓殑鈥淏inary鈥濋夐」鍗★紝鐒跺悗閫変腑鈥淩elocate Instrumented Binaries鈥濓紙瀹冧笌 REBASE 鏍峰紡鐨勯噸瀹氫綅緇濆娌℃湁浠諱綍鍏崇郴錛夛紝騫朵笖鎸囧畾鎮ㄥ笇鏈涘皢鏇存敼鍚庣殑浜岃繘鍒舵枃浠剁Щ鑷充綍澶勩?/p>
鈥淚nstrumentation鈥濋夐」鍗′嬌鎮ㄥ彲浠ユ寚瀹氬笇鏈涘湪浠〃鍖栧彂鐢熶箣鍓嶅拰涔嬪悗榪愯鐨勭▼搴忋傚鏋滄偍闇瑕佸浠〃鍖栫殑浜岃繘鍒舵枃浠舵墽琛屽叾浠栦換鍔★紙渚嬪錛屽皢鍏剁Щ鍔ㄥ埌鍏ㄥ眬紼嬪簭闆嗙紦瀛樹腑鎴?Web 鏈嶅姟鍣ㄤ笂鐨勭壒瀹氫綅緗級錛屽垯璇ラ夐」鍗″彲鑳藉緢鏈夌敤銆傗淎dvanced鈥濋夐」鍗″湪璇ユ祴璇曠増涓湭鍏紑銆傛渶鍚庯紝閫氳繃鈥淐ounters鈥濋夐」鍗★紝鎮ㄥ彲浠ュ憡璇?EPT 浠庣郴緇熺殑 CPU 涓敹闆嗗叾浠栨暟鎹紝渚嬪錛孡2 鎴?L3 緙撳瓨璇誨彇涓嶄腑銆傛樉鐒訛紝榪欎簺閫夐」鏄彧鏈夊皯鏁板紑鍙戜漢鍛樻墠浼氶渶瑕佺殑闈炲父楂樼駭鐨勯夐」錛屼絾鏄鏋滄偍紜疄闇瑕佸畠浠紝閭d箞瀹冧滑鍙互鍙戞尌宸ㄥぇ鐨勪綔鐢ㄣ?/p>
鍦ㄦ垜緇х畫璁ㄨ鏌ョ湅閲囨牱鏁版嵁涔嬪墠錛屾垜鎯蟲彁涓涓嬶紝鈥淧erformance Explorer鈥濈獥鍙e彲浠ユ牴鎹偍鐨勯渶瑕佹墦寮浠繪剰澶氫釜鎬ц兘浼氳瘽銆傚綋鎮ㄥ笇鏈涜瀵熺壒瀹氱殑鍓嶅悗鏂規錛屾垨鑰呭笇鏈涚敤涓嶅悓鐨勪華琛ㄥ寲浜岃繘鍒舵枃浠舵墽琛屽崟鐙殑嫻嬭瘯榪愯鏃訛紝榪欎竴鐐規瀬涓烘湁鐢ㄣ傚綋鎮ㄦ墦寮澶氫釜鎬ц兘浼氳瘽鏃訛紝搴斿綋紜繚鍙抽敭鍗曞嚮鐗瑰畾鐨勪細璇濓紝閫夋嫨鈥淪et as Current Session鈥濅互渚胯璇ヤ細璇濈殑璁劇疆鎵ц錛岀劧鍚庡皢鎶ュ憡褰掓。鍒板畠鐨勬姤鍛婅妭鐐逛腑銆?/p>
鏌ョ湅鍒嗘瀽鍣ㄦ暟鎹?/p>
灝嗘ц兘浼氳瘽璁劇疆涓烘偍甯屾湜鎵ц鐨勬搷浣滀互鍚庯紝灝卞彲浠ュ惎鍔ㄥ垎鏋愪簡銆傛垜灝嗛鍏堝 Animated Algorithm 鎵ц閲囨牱鍒嗘瀽錛屼互鏌ョ湅鎴戞槸鍚﹀彲浠ユ壘鍒頒竴浜涚儹鐐廣備粠閲囨牱涓幏寰楄壇濂芥暟鎹殑鍏抽敭鍦ㄤ簬鎵ц杈冮暱鏃墮棿鐨勮繍琛屻傚浜?Animated Algorithm錛屾垜浼氬皢 15 涓帓搴忕畻娉曚腑鐨勬瘡涓涓畻娉曡繍琛屼袱嬈★紝騫跺皢閲囨牱璁劇疆涓洪粯璁ょ殑涓鐧句竾涓椂閽熷懆鏈熴?/p>
鍦ㄥ畬鎴愭煇涓繍琛屼箣鍚庯紝EPT 浼氬皢璇ヨ繍琛岀殑鎶ュ憡鏀懼埌鎬ц兘浼氳瘽鐨勨淩eports鈥濇枃浠跺す涓侲PT 鍦ㄨ繍琛屾湡闂存敹闆嗗師濮嬫ц兘鏁版嵁錛屽茍灝嗗叾嫻佸紡浼犺緭鍒版姤鍛婃枃浠朵腑錛堜笉鍋氫換浣曞垎鏋愶級銆傝繖鏍鳳紝鎮ㄥ彲浠ュ湪榪愯搴旂敤紼嬪簭鏃墮伩鍏嶆墍鏈夌郴緇熷紑閿錛屼絾鏄偍灝嗕負澶у瀷鎶ュ憡鏂囦歡浠樺嚭浠d環銆傛垜鍒氭墠瀹屾垚鐨勮繍琛岀殑閲囨牱鎶ュ憡鏂囦歡澶у皬涓?3.70MB錛屽畠鐢ㄤ簡澶х害涓夊垎閽熸墠瀹屾垚銆傝紜繚鎮ㄥ湪榪愯 EPT 鏃跺叿鏈夊ぇ閲忕殑紓佺洏絀洪棿銆?/p>
鎵鏈夋暟鎹垎鏋愶紙瀹冨繀鐒朵即鏈夎皟鐢ㄥ爢鏍堢殑鐢熸垚浠ュ強鎬ц兘鏁板瓧鐨勮綆楋級閮藉湪鎮ㄦ墦寮鎶ュ憡鏂囦歡鏃跺彂鐢熴傚浜庢祴璇曠増錛屽湪鎵撳紑鏂囦歡鏃墮熷害鍙兘浼氶檷浣庛傜湅璧鋒潵瑙嗗浘濂藉儚澶勪簬鏃犻檺寰幆涓紝浣嗘槸錛屽鏋滆繘搴︽爮姝e湪鎶ュ憡紿楀彛涓Щ鍔紝閭d箞璇鋒偍鑰愬績涓浜涳紝鏂囦歡鏈緇堝皢寮瑰嚭銆?/p>
浠諱綍鍒嗘瀽榪愯涓殑絎竴涓鍥炬槸鈥淧erformance Report Summary鈥濓紝瀹冩樉紺哄湪鍒氬垰瀹屾垚鐨?Animated Algorithm 閲囨牱榪愯鐨?b>鍥?4 涓備笉鍑烘墍鏂欙紝閲囨牱灝嗗彂鐢熷湪鏁翠釜搴旂敤紼嬪簭涓紝鍥犳鎮ㄦ鍦ㄦ煡鐪嬬殑淇℃伅涔熷氨鏄偍灝嗗湪搴旂敤紼嬪簭涓湅鍒扮殑鍐呭錛氬ぇ閮ㄥ垎宸ヤ綔閮藉彂鐢熷湪妗嗘灦綾誨簱鎴栨搷浣滅郴緇熷唴閮ㄣ傚鏋滄偍紜疄鍦ㄩ噰鏍封淪ummary鈥濊鍥句腑鐪嬪埌浜嗘偍鐨勪竴涓柟娉曪紝鍒欐偍寰堝彲鑳界湅鍒頒簡涓涓ц兘闂銆?/p>
鍥?4 EPT 閲囨牱鎬ц兘鎶ュ憡鎽樿
蹇熸祻瑙堜竴涓?b>鍥?4錛屾偍鍙兘鎯崇煡閬?Inclusive Sampled 鍜?Exclusive Sampled 涔嬮棿鐨勫尯鍒侲xclusive Sampled 鎰忓懗鐫璇ユ柟娉曞湪鍙栨牱鏃朵綅浜庡爢鏍堢殑欏墮儴銆傛崲鍙ヨ瘽璇達紝瀹冩槸褰撳墠姝e湪鎵ц鐨勫嚱鏁般侷nclusive Sampled 鎰忓懗鐫璇ュ嚱鏁板湪鍙栨牱鏃跺嚭鐜板湪璋冪敤鍫嗘爤涓傚洜鑰岋紝鍖呭惈鏂規硶鏄綋鍓嶆鍦ㄦ墽琛岀殑鏂規硶鐨勮皟鐢ㄦ柟銆?/p>
鍦ㄩ噰鏍鋒柟妗堜腑錛屼竴涓柟娉曞湪璋冪敤鍫嗘爤 (Inclusive Sampled) 涓嚭鐜扮殑嬈℃暟瓚婂錛岃鍑芥暟鍦ㄦ墽琛屼腑鑺辮垂鐨勬椂闂村氨瓚婂錛屽洜姝よ繖閲屾槸鎮ㄩ渶瑕侀噸鐐瑰叧娉ㄤ互榪涜鎬ц兘璋冩暣鐨勫湴鏂廣傚浜?Exclusive Sampled 鍑芥暟鑰岃█錛屽嚱鏁板湪閭i噷棰戠箒鍑虹幇琛ㄦ槑璇ュ嚱鏁版鍦ㄨ棰戠箒鍦拌皟鐢紝浣嗘槸瀹冪殑鎵ц瀹為檯涓婂彲鑳介潪甯稿揩閫熴傚浜庡儚 Animated Algorithm 榪欐牱闇瑕佽繘琛屽ぇ閲忓浘褰㈠鐞嗙殑搴旂敤紼嬪簭錛屾垜瀹屽叏鑳藉棰勬枡鍒?GDIPLUS.DLL 涓殑鏌愪釜鍑芥暟灝嗛潬榪戝垰鍒氭樉紺虹殑鍒楄〃鐨勯《閮ㄣ傚湪鍥?4 涓紝浣嶄簬 GDIPLUS.DLL 涓亸縐婚噺 0x5B8D 澶勭殑鍑芥暟錛堝畠鎭板ソ鏄?FLOOR 鍑芥暟錛夎涓鐩磋皟鐢紝浠ヤ究璁$畻鍦ㄥ睆騫曚笂鐨勫摢涓綅緗樉紺烘煇浜涘唴瀹廣傚綋鎮ㄨ瀵熸ц兘榪愯鏃訛紝璇風‘淇濊緗鍙鋒湇鍔″櫒浠ヨ幏寰楀彲鑳藉瓨鍦ㄧ殑鏈浣充俊鎭傚湪鎾板啓鏈枃鏃訛紝鎴戜嬌鐢ㄤ簡 EPT 鐨勬湭鍙戝竷鐗堟湰錛屽洜鑰岀鍙峰皻涓嶅彲鐢ㄣ?/p>
鍦ㄦ垜璺沖埌鍏朵粬瑙嗗浘涓互鍓嶏紝鎴戝笇鏈涗華琛ㄥ寲 Animated Algorithm錛屽茍涓斿畬鎴愪笌鎴戦拡瀵歸噰鏍峰垎鏋愬櫒瀹屾垚鐨勮繍琛岀浉鍚岀殑榪愯錛屼互渚挎樉紺轟華琛ㄥ寲榪愯鐨勬ц兘鎶ュ憡鎽樿銆傛濡傛偍鍙互鐚滃埌鐨勯偅鏍鳳紝浠〃鍖栫殑榪愯浼氱敓鎴愭瘮閲囨牱榪愯澶氬緱澶氱殑鏁版嵁銆傚浜庤榪愯錛屾垜浠〃鍖栦簡 Animated Algorithm 涓殑鍏ㄩ儴浜斾釜紼嬪簭闆嗭紝騫舵渶緇堝緱鍒頒竴涓?375MB 澶у皬鐨勪細璇濇枃浠躲?/p>
閲囨牱鍜屼華琛ㄥ寲鏁版嵁涔嬮棿鐨勪富瑕佸尯鍒槸錛氶噰鏍鋒煡鐪嬫暣涓繘紼嬬┖闂達紝騫朵笖灝嗘樉紺烘鏋剁被搴撴垨鎿嶄綔緋葷粺鍐呴儴錛堟崲鍙ヨ瘽璇達紝灝辨槸鎮ㄥ湪鍏朵腑涓嶅叿鏈夋簮浠g爜鐨勪綅緗級鐨勮皟鐢ㄣ傚彟涓鏂歸潰錛屼華琛ㄥ寲鍙煡鐪嬪簲鐢ㄧ▼搴忎互鍙婃偍鍦ㄩ潪浠〃鍖栨ā鍧椾笂鐩存帴璋冪敤鐨勬柟娉曘備緥濡傦紝濡傛灉鎮ㄥ叿鏈変竴涓淗ello World!鈥濆簲鐢ㄧ▼搴忥紝騫朵笖瀹冪殑 Main 鍙皟鐢?Console.WriteLine錛屽垯鎮ㄥ皢鑾峰緱 Main 涓換浣曞伐浣滅殑璁℃椂淇℃伅浠ュ強 Console.WriteLine 闀垮害鐨勮鏃朵俊鎭紝浣嗘槸鎮ㄤ笉浼氳幏寰楁湁鍏?Console.WriteLine 鏂規硶鐨勪換浣曡緇嗕俊鎭?/p>
鍥?5 鏄劇ず浜嗕華琛ㄥ寲榪愯鐨勬ц兘鎶ュ憡鎽樿銆傜涓涓〃鈥淢ost Called Functions鈥濇樉紺轟簡棰戠箒浣跨敤鐨勫嚱鏁般傝琛ㄤ腑鐨勭涓鍒楄閿欒鏍囪涓烘椂闂達紱瀹冨疄闄呬笂琛ㄧず瀵硅鍑芥暟鐨勮皟鐢ㄦ鏁般傜櫨鍒嗘瘮鍒楁樉紺轟簡瀵硅鐗瑰畾鍑芥暟榪涜鐨勮皟鐢ㄦ繪鏁版墍鍗犵殑鐧懼垎姣斻傚湪澶у鏁拌繍琛屼腑錛屾偍灝嗗湪榪欓噷鐪嬪埌妗嗘灦綾誨簱鎴栨搷浣滅郴緇熷嚱鏁般傚鏋滄偍鐪嬪埌涓浜涙潵鑷偍鑷繁鐨勪唬鐮佺殑鍑芥暟錛屽垯鎮ㄦ渶濂戒簡瑙d竴涓嬫偍涓轟粈涔堝姝ら綣佸湴璋冪敤璇ョ壒瀹氬嚱鏁般?/p>
鍥?5 浠〃鍖栬繍琛岀殑鎽樿
鈥淔unctions with Most Individual Work鈥濊〃鍒楀嚭浜嗛偅浜涜姳璐瑰ぇ閮ㄥ垎鏃墮棿浠ヤ粎浠呮墽琛岃鍑芥暟錛堟病鏈変換浣曞叾浠栧嚱鏁拌皟鐢級鐨勬柟娉曘傝繖涔熺О涓鴻鍑芥暟鐨勭嫭鍗犳椂闂淬傚浜庢祴璇曠増鏈紝鈥淭ime鈥濆垪鐨勫崟浣嶄負鏃墮挓璧版牸鏁般傚浜庢渶緇堢増鏈紝鍗曚綅灝嗘槸姣銆備絾鏄紝鎴戣涓烘ц兘榪愯鐨勫疄闄呭師濮嬪崟浣嶅浜庡垎鏋愭病鏈夌敤銆傛渶閲嶈鐨勬暟瀛楁槸鐧懼垎姣斻傚湪瑙傚療鎬ц兘闂鏃訛紝鎮ㄥ笇鏈涚煡閬擄紝涓庡簲鐢ㄧ▼搴忎腑鐨勬墍鏈夊叾浠栨柟娉曠浉姣旓紝鍝釜鏂規硶鍗犵敤浜嗘渶闀跨殑鏃墮棿銆傛偍鍦ㄨ瀵熷儚 3519639455 鍜?3492589504 榪欐牱鐨勪袱涓暟瀛楁椂錛屽緢闅懼瀹冧滑榪涜浠涔堟瘮杈冦傚垢榪愮殑鏄紝璇ヨ〃鍖呭惈鐧懼垎姣旓紝鑰屾垜瀵?EPT 鍥㈤槦鐨勫緩璁槸浠庡浘琛ㄤ腑涓㈠純鍘熷鏁版嵁銆?/p>
鏈鍚庝竴涓〃鈥淔unctions Taking Longest鈥濇樉紺烘柟娉曠殑瀹為檯鏃墮棿錛堜篃縐頒負璺戣〃鏃墮棿鎴栬繍琛屾椂闂達級銆傚垎鏋愬櫒璁板綍鏂規硶鐨勫叆鍙g偣鏃墮棿鍜屽嚭鍙g偣鏃墮棿錛屽茍灝嗚繖涓や釜鍊肩浉鍑忋傝鏁板瓧娑電洊浜嗚璋冪敤鐨勬墍鏈夊瓙鏂規硶銆佹墍鏈変笂涓嬫枃鍒囨崲浠ュ強璇ユ柟娉曟墽琛岀殑浼戠湢銆傚湪鍥?5 涓紝鎮ㄥ彲浠ョ湅鍒?System.Windows.Forms.Application.Run 鍗犵敤浜嗘渶闀挎椂闂達紝灝卞儚鎮ㄥ Windows 紿椾綋搴旂敤紼嬪簭鎵棰勬枡鐨勯偅鏍楓傚敖綆″緢澶氬紑鍙戜漢鍛樺皢娉ㄦ剰鍔涢泦涓簬鐙崰鏃墮棿錛屼絾榪欏彧鏄暣涓ц兘鐘跺喌鐨勪竴灝忛儴鍒嗐傚鏋滄柟娉曟鍦ㄥ鏁版嵁搴撹繘琛岃皟鐢ㄦ垨鑰呰繘琛?Web 鏈嶅姟璋冪敤錛屽垯鎮ㄧ殑鏂規硶鍦ㄨ繍琛屾椂鎵鍦ㄧ殑綰跨▼灝嗗湪絳夊緟榪欎簺璋冪敤榪斿洖鏁版嵁鏃墮樆濉烇紝浠庤屼嬌寰楄綰跨▼浠?CPU 涓縐昏蛋銆傞氳繃瀵嗗垏鍏蟲敞鏂規硶鐨勮繍琛屾椂闂達紝鎮ㄥ彲浠ユ壘鍒頒唬鐮佷腑姝e湪闄嶄綆搴旂敤紼嬪簭榪愯閫熷害鐨勯儴鍒嗐?/p>
灝界鎽樿瑙嗗浘寰堜笉閿欙紝浣嗘偍鏈鎰熷叴瓚g殑灝嗘槸鏌ョ湅浠g爜鍦ㄤ綍澶勯樆濉炰簡緋葷粺鐨勫叾浣欓儴鍒嗭紙瀵逛簬閲囨牱榪愯鑰岃█錛夛紝鎴栬呴樆濉炰簡搴旂敤紼嬪簭鐨勫叾浠栨柟娉曪紙瀵逛簬浠〃鍖栬繍琛岃岃█錛夈傝繖鏄淔unction鈥濊鍥劇殑鑱岃矗鑼冨洿 鈥?閫氳繃鍗曞嚮鎶ュ憡紿楀彛搴曢儴鐨勨淔unction鈥濇寜閽彲浠ラ夋嫨璇ヨ鍥俱傛偍榪樺彲浠ュ弻鍑燴淪ummary鈥濊鍥劇殑浠諱綍鏂規硶浠ヨ煩鑷斥淔unction鈥濊鍥俱?/p>
瀵逛簬閲囨牱榪愯錛屸淔unction鈥濊鍥炬樉紺轟簡鑷沖皯涓涓寘鍚崟鑾蜂腑鎵鏈夊嚱鏁版崟鑾風殑鍒楄〃銆傚浜庝華琛ㄥ寲榪愯錛屾偍灝嗙湅鍒頒綔涓鴻榪愯鐨勪竴閮ㄥ垎璋冪敤鐨勬墍鏈変華琛ㄥ寲鏂規硶銆傛棤璁烘偍姝e湪鎵ц鍝綾誨瀷鐨勫垎鏋愶紝閮戒細鍦ㄢ淔unction鈥濊鍥句腑鏄劇ず寰堝鏁版嵁錛屽洜姝ゆ偍鍙互瀵逛唬鐮佺殑鐘跺喌鏈変竴鐐瑰効鎰熻銆?/p>
榛樿鎯呭喌涓嬶紝閲囨牱鈥淔unction鈥濊鍥炬樉紺衡淚nclusive Samples鈥濆垪鍜屸淓xclusive Samples鈥濆垪銆傜敱浜庢垜鍠滄鐧懼垎姣旀暟瀛楋紝鍥犳鎴戝彸閿崟鍑諱簡鍒楁爣棰樹互鍚戝垪鏍囬涓坊鍔犫淚nclusive Percent鈥濆拰鈥淓xclusive Percent鈥濄傚鏋滄偍瑕佸澶氳繘紼嬬郴緇熻繘琛岄噰鏍鳳紝鍒欏彲鑳藉笇鏈涘寘鍚叾浠栧垪錛堜緥濡傦紝鈥淧rocess Name鈥濇垨鈥淧rocess ID鈥濓級錛屼互渚挎偍鍙互鏍囪瘑鍝釜鏂規硶閲囨牱涓庡摢涓繘紼嬬浉閰嶃傛偍榪樺彲浠ュ湪浠〃鍖栤淔unction鈥濊鍥句腑璁劇疆鍒楁爣棰橈紝浣嗘槸鎮ㄥ皢鍏鋒湁涓嶅悓鐨勬爣棰樼粍浠ヤ緵閫夋嫨銆?/p>
鍦ㄢ淔unction鈥濊鍥句腑鍒嗘瀽閲囨牱榪愯鏃訛紝鎴戝枩嬈㈤鍏堟壂涓鐪尖淔unction鈥濊鍥劇殑澶村嚑涓寜鈥淚nclusive Samples鈥濆垪鎺掑簭鐨勯〉錛屼互浜嗚В姝e湪鎵ц鐨勬柟娉曘傚鏋滄垜鍦ㄥご鍑犱釜欏典腑娌℃湁鐪嬪埌鎴戠殑浠諱綍鏂規硶錛屽垯鎴戜細鍙抽敭鍗曞嚮鈥淔unction鈥濊鍥懼茍閫夋嫨鈥淕roup by Module鈥濓紝浠ヤ究鑾峰緱鏍戞姤鍛婅鍥俱傚綋鎮ㄥ皢鍑芥暟鎸夋ā鍧楀垎緇勬椂錛屾寜鐗瑰畾鍒楁帓搴忓彲浠ユ紜墽琛?鈥?榪欐槸涓欏瑰緢涓嶉敊鐨勫姛鑳姐?/p>
瀵逛簬浠〃鍖栬繍琛岋紝鈥淔unction鈥濊鍥懼叿鏈夋洿澶氳鏄劇ず鐨勫垪銆傚鏋滄偍鎷ユ湁涓鍙?40 鑻卞鐨勬樉紺哄櫒錛屽垯鏃犻渶鏈澶у寲 Visual Studio .NET 紿楀彛灝卞簲褰撹兘澶熺湅鍒版墍鏈夎繖浜涘垪銆傚浜庢垜浠腑鐨勫叾浠栦漢鑰岃█錛屾煡鐪嬧淔unction鈥濊鍥劇殑鏈浣蟲柟寮忔槸鎸?Alt + Shift + Enter 浠ュ垏鎹㈠埌鍏ㄥ睆騫曟ā寮忋?/p>
鍦ㄨ繖浜涘垪涓紝鈥淔unction鈥濊鍥句腑鐨勪華琛ㄥ寲榪愯浣跨敤鎴戝湪鍓嶉潰瑙i噴榪囩殑鈥滃寘鍚濆拰鈥滅嫭鍗犫濇湳璇備絾鏄紝榪樻湁鍙︿竴涓嬌浜烘販娣嗙殑鏈錛氬簲鐢ㄧ▼搴忋傛濡傛垜鎻愬埌鐨勯偅鏍鳳紝榪愯鏃墮棿鏄粠涓涓華琛ㄥ寲鐐瑰埌鍙︿竴涓華琛ㄥ寲鐐圭殑鎬繪椂闂達紝鑰屼笉綆¤綰跨▼鍙兘榪涜浜嗗摢浜涗笂涓嬫枃鍒囨崲銆傚簲鐢ㄧ▼搴忔椂闂寸殑鎬濇兂鏄?EPT 灝嗘彁鍙栧嚭鍦ㄨ繖浜涗笂涓嬫枃鍒囨崲涓墍鑺辮垂鐨勬椂闂達紝浠ヤ究鎮ㄥ彲浠ョ湅鍒版偍鐨勪唬鐮佸湪 CPU 涓疄闄呮墽琛岀殑鏃墮棿銆?/b>鍥?6 鍒楀嚭浜嗘偍灝嗗湪浠〃鍖栤淔unction鈥濊鍥句腑鐪嬪埌鐨勪笉閭d箞鏄庢樉鐨勫垪鐨勫畾涔夈傛偍鍙兘甯屾湜灝嗗畠浼犻佸埌鏄劇ず鍣ㄤ笂錛岀洿鍒?EPT 鐨勮仈鏈哄府鍔╅棶涓栥?/p>
鍦ㄨ瀵熶華琛ㄥ寲榪愯鐨勨淔unction鈥濊鍥炬椂錛屾垜娣誨姞浜嗚繖浜涘垪浠ユ煡鐪嬪悇縐嶈鏃剁殑鐧懼垎姣斿鹼紝縐婚櫎鍘熷鏁板瓧鏃墮棿鍒楋紝騫朵笖娣誨姞浜嗕袱涓漿鎹㈠垪銆傝繖涓烘垜鎻愪緵浜嗘湁鍏寵榪愯鐨勬洿娓呮櫚瑙嗗浘銆傛垜鍦ㄦ帓搴忔椂鎵渚濇嵁鐨勭涓涓垪鏄? Application Exclusive Time鈥濓紝鍥犱負鎴戝笇鏈涚湅鍒板摢涓嚱鏁版鍦ㄥ畬鎴愬ぇ閮ㄥ垎宸ヤ綔銆傜敱浜庝華琛ㄥ寲鍦ㄦ柟娉曡繘琛岀殑鎵鏈夊瓙璋冪敤鍛ㄥ洿鏀懼叆浜嗘帰嫻嬶紝鎵浠ユ偍瀹屽叏鏈夊彲鑳藉湪璇ュ垪琛ㄧ殑欏墮儴鐪嬪埌妗嗘灦綾誨簱鎴栨搷浣滅郴緇熴傚疄闄呬笂錛屽浜庢垜鐨?Animated Algorithm 榪愯錛孲ystem.Drawing.SolidBrush.ctor 鍜?System.Drawing.Brush.Dispose 鍦?Application Exclusive Time 鐧懼垎姣斾腑琚垪涓虹涓鍜岀浜岋紝鍏剁櫨鍒嗘瘮鍒嗗埆涓?14.982% 鍜?14.867%銆傛垜緙栧啓鐨勭涓涓嚱鏁版槸浣嶄簬絎笁浣嶇殑 Bugslayer.SortDisplayGraph.SorterGraph.UpdateSingleFixedElement錛堝叾鐧懼垎姣斾負 12.217%錛夛紝瀹冨湪鍥懼艦涓粯鍒跺崟鐙殑鏉°傛牴鎹簲鐢ㄧ▼搴忕被鍨嬬殑涓嶅悓錛屾垜鍦ㄦ煡鐪嬧淔unction鈥濊鍥炬椂鍙兘浼氶夋嫨鎸夊叾浠栧垪鎺掑簭銆傚鏋滃瓨鍦?Web 鏈嶅姟鎴栨暟鎹簱璋冪敤錛屽垯鎴戝皢鏌ョ湅 % Elapsed Inclusive Time錛屼互渚垮彲浠ョ湅鍒版槸鍚︽湁鐗瑰畾鏂規硶鍗峰叆鍒伴暱鏃墮棿闃誨涓傚浜庡儚 Animated Algorithm 榪欐牱鐨勫簲鐢ㄧ▼搴忥紝鎴戣繕灝嗘煡鐪?Application Inclusive Time 鐨勭櫨鍒嗘瘮銆?/p>
鍩轟簬鎴戠殑浠〃鍖栬繍琛屼腑鐨勪笂榪版暟瀛楋紝鎴戝緢鎯蟲煡鏄庢槸璋佸湪瀵?SolidBrush 鏂規硶榪涜榪欎簺璋冪敤錛屽洜姝ゆ垜鍙抽敭鍗曞嚮 .ctor 鏂規硶騫墮夋嫨鈥淪how in Caller/Callee鈥濊鍥撅紝浠ヤ究鏌ョ湅鏄皝鍦ㄨ皟鐢ㄨ鏂規硶銆傝瑙嗗浘錛堝畠瀵逛簬閲囨牱鍒嗘瀽涔熷彲鐢級浣挎偍涓鐪煎氨鍙互鐪嬪嚭鐩爣鏂規硶鐨勬墍鏈夎皟鐢ㄦ柟錛屼互鍙婅鐩爣鏂規硶璋冪敤鐨勬墍鏈夋柟娉曘?/p>
鍥犱負 .ctor 鏂規硶娌℃湁浠〃鍖栵紝鎵浠モ淐aller/Callee鈥濊鍥懼皢涓嶄細鏄劇ず浠諱綍琚皟鐢ㄦ柟錛屼絾鏄畠鏄劇劧浼氭樉紺鴻皟鐢ㄦ柟銆傛垜鍙屽嚮浜嗚繖涓敮涓鐨勮皟鐢ㄦ柟錛屽畠鎭板ソ鏄叿鏈夌涓夐珮 Application Exclusive Time 騫跺叿鏈?a target="_blank">鍥?7 鎵紺鴻鍥劇殑 UpdateSingleFixedElement 鏂規硶銆?/p>
鍦?a target="_blank">鍥?7 涓紝浣嶄簬瑙嗗浘涓儴鐨勪笅鎷夌粍鍚堟鏄洰鏍囨柟娉曪紙鍦ㄦ湰渚嬩腑涓?UpdateSingleFixedElement錛夈傛柟娉曚笂鏂圭殑緗戞牸鍖呭惈浜嗙洰鏍囨柟娉曠殑鎵鏈夎皟鐢ㄦ柟錛堣皟鐢ㄦ柟錛夈傜洰鏍囨柟娉曚笅鏂圭殑緗戞牸鍖呭惈浜嗙洰鏍囨柟娉曡皟鐢ㄤ互瀹屾垚鍏跺伐浣滅殑鎵鏈夋柟娉曪紙琚皟鐢ㄦ柟錛夈傚鏋滄偍甯屾湜鏌ョ湅鏄皝璋冪敤浜嗙壒瀹氳皟鐢ㄦ柟錛岃鍙屽嚮璇ヨ皟鐢ㄦ柟鏂規硶錛岃鏂規硶灝嗗彉涓虹洰鏍囨柟娉曪紝騫朵笖鎮ㄥ皢鐪嬪埌鍘熷鐩爣鏂規硶涓嬮檷鍒拌璋冪敤鏂歸儴鍒嗕腑銆傚疄璐ㄤ笂錛屾偍鍙槸灝嗗爢鏍堥亶鍘嗕簡涓閬嶃?/p>
浠呬粎鍩轟簬鍥?7 涓殑瑙嗗浘錛屾偍灝卞彲浠ヨ鯨鍒嚭娼滃湪鐨勬ц兘闂銆侫nimated Algorithm 浼間箮涓嶅叿鏈変換浣曠獊鍑虹殑鎬ц兘闂錛屼絾鏄?SolidBrush .ctor 鍜?Dispose 鍗犵敤浜嗗姝ゅ鐨勬椂闂村茍涓旈兘鍦?UpdateSingleFixedElement 鏂規硶鍐呴儴璋冪敤錛堣皟鐢ㄤ簡 351,872 嬈★級錛岃繖涓簨瀹炶〃鏄庢垜鍋氫簡涓浠舵剼锠㈢殑浜嬫儏 鈥?鎴戞瘡嬈¢兘閫氳繃璇ュ嚱鏁板垱寤虹敾絎旓紝鑰屽疄闄呬笂搴旇灝嗗叾緙撳瓨銆傚綋鎴戝湪灝嗘潵鐨勬煇涓鏈?MSDN Magazine 涓紑濮嬬敤 EPT 鍒嗘瀽浠g爜鏃訛紝鎮ㄨ繕灝嗙湅鍒?Animated Algorithm 鐨勫叾浠栦竴浜涢棶棰樸?/p>
鏁版嵁鐨勬渶鍚庝竴涓父鐢ㄨ鍥炬槸鈥淐allstack鈥濊鍥俱傚湪榪欓噷錛屾偍鍙互閫氳繃鏇村叿灞傛鎬х殑鏂瑰紡鐪嬪埌鎮ㄥ湪鈥淐aller/Callee鈥濈獥鍙d腑瑙傚療鍒扮殑璋冪敤鍫嗘爤銆傚浜庨噰鏍瘋繍琛岋紝鎮ㄥ皢鍦ㄢ淐allstack鈥濊鍥劇殑欏跺眰鐪嬪埌寰堝鐨勬潯鐩紝鍥犱負榪欎簺鏉$洰涓殑姣忎竴涓兘浠h〃涓涓寘鍚嫭鍗犳牱鏈殑鍞竴鐐廣傚綋鎮ㄥ湪閲囨牱榪愯涓睍寮欏規椂錛屾偍榪樺皢鐪嬪埌錛屽湪鐩稿悓綰у埆鍋跺皵浼氬瓨鍦ㄤ竴浜涢」錛岃繖浜涢」鎸囩ず浣嶄簬鏍歸儴鐨勫嚱鏁板叿鏈夊涓紩鍚戝畠鐨勮皟鐢ㄦ爲銆傛牴浣嶇疆涓樉紺虹殑欏規槸鏍堥《銆?/p>
瀵逛簬浠〃鍖栬繍琛岋紝鈥淐allstack鈥濈獥鍙e皢鍏鋒湁涓庡簲鐢ㄧ▼搴忎腑鐨勬瘡涓嚎紼嬬浉瀵瑰簲鐨勬牴鍏冪礌銆傚洜涓?Animated Algorithm 鍙湁涓や釜綰跨▼錛屾墍浠ユ偍鍙兘鍦ㄦ爲鏍圭駭鍒湅鍒頒袱涓」銆傚湪鈥淐allstack鈥濊鍥句腑錛屾偍鍙互鐪嬪埌緇濆璋冪敤鍫嗘爤錛堜粠浠〃鍖栫殑絎竴涓柟娉曞悜涓嬪埌鏈鍚庝竴涓柟娉曪級錛屽洜姝ゆ偍鍙互鐪熸浜嗚В搴旂敤紼嬪簭鐨勬墽琛屾柟寮忋傛垜宸茬粡鏈夊緢澶氭瀵規垜璁や負浠g爜鎵瀹屾垚鐨勫伐浣滃拰浠g爜瀹為檯涓婂畬鎴愮殑宸ヤ綔涔嬮棿鐨勫樊寮傛劅鍒板悆鎯娿?/p>
鎮ㄥ彲浠ヨ姳璐瑰ぇ閲忔椂闂村湪鈥淐allstack鈥濈獥鍙d腑鍒嗘瀽浠g爜銆傚綋閫氳繃搴旂敤紼嬪簭瑙傚療鐗瑰畾鐨勮釜榪規椂錛屾偍鍙互閫氳繃閫夋嫨鎰熷叴瓚g殑鐗瑰畾鑺傜偣錛屽悜涓嬬Щ鍔紝鍙抽敭鍗曞嚮錛屽茍閫夋嫨鈥淪et Root鈥濊彍鍗曢夐」錛屾潵娑堥櫎澶ч噺鍣煶銆傚湪鍥?8 涓紝鎴戝笇鏈涙煡鐪?NSort.SwapSorter.Sort 榪涜鐨勬墍鏈夎皟鐢紝鍥犳灝嗗畠璁劇疆涓烘牴鍙互娑堥櫎 UI 綰跨▼鐨勫獎鍝嶃?/p>
鍦ㄥ皢鏉ョ殑鏌愪竴鏈熶腑錛屾垜灝嗘洿璇︾粏鍦拌璁?EPT 鏄劇ず鍖哄煙涓殑鏈鍚庝袱涓夐」鍗★細鈥淭race鈥濆拰鈥淭ype鈥濄傚湪鈥淭ype鈥濊鍥句腑錛屾偍鍙互瑙傚療宸茬粡鍦ㄥ簲鐢ㄧ▼搴忎腑鍒嗛厤鐨勫璞°傚畠鍦ㄦ祴璇曠増涓湁鏁堛傚綋鎴戝湪鍓嶉潰璁ㄨ鎬ц兘浼氳瘽灞炴ф椂錛屾垜鎻愬埌榪囧湪鈥淕eneral鈥濋夐」鍗′笂鏈変竴涓淢anaged Allocation Profiling鈥濋儴鍒嗐傚鏋滄偍閫夋嫨鈥淎llocations-only鈥濆崟閫夋寜閽紝鍒?EPT 浼氬~鍏呪淭ype鈥濊鍥俱傚湪嫻嬭瘯鐗堜腑錛屾姤鍛婄湅璧鋒潵綾諱技浜庡叾浠栬澶氬伐鍏蜂腑鐨勬姤鍛婏紝浣嗘槸鏁版嵁鏀墮泦浼間箮涓嶅儚鍦ㄥ叾浠栧伐鍏蜂腑閭f牱鍏鋒湁濡傛涔嬪鐨勭郴緇熷紑閿銆傛渶鍚庯紝瑕佷簡瑙?Enterprise Performance Tool 鍥㈤槦鐨勬兂娉曚互鍙婃湁鍏寵宸ュ叿鐨勬洿澶氫俊鎭紝璇風‘淇濆湪 blogs.msdn.com/profiler 鏌ョ湅浠栦滑鐨勭綉緇滄棩璁般?/p>
John Robbins 鏄?Wintellect 鐨勫垱濮嬩漢涔嬩竴錛岃鍏徃鏄竴瀹朵笓闂ㄨ嚧鍔涗簬 Windows 鍜?.NET Framework 鐨勮蔣浠跺挩璇€佹暀鑲插拰寮鍙戝叕鍙搞備粬鐨勬渶鏂拌憲浣滄槸鈥淒ebugging Applications for Microsoft .NET and Microsoft Windows鈥?Microsoft Press, 2003)銆傝鑱旂郴 John錛岃璁塊棶 www.wintellect.com銆?/p>
鍦ㄦ棩甯哥殑緙栫▼涓紝紼嬪簭鍛樼粡甯哥涓嶅紑鐨勫伐浣滀箣涓錛屽氨鏄皟璇曘傚綋鍐欏ソ涓孌典唬鐮佹垨紼嬪簭鍚庯紝鍦ㄨ繍琛屽悗鎬諱細鍑虹幇榪欐牱閭f牱鐨勯棶棰橈紝姣斿鍚勬牱鐨勯敊璇紝紼嬪簭鍛樺氨蹇呴』榪涜璋冭瘯錛屽皢榪欎簺閿欒鎺掗櫎銆傚湪鏈鏂板嚭鐐夌殑Visual聽Studio聽2005涓紝灝嗘彁渚涘崄鍒嗗己澶ц屾柟渚跨殑璋冭瘯鍔熻兘錛屼粠鑰屼嬌紼嬪簭鍛樿兘鑺傜害鏃墮棿錛屾彁楂樺伐浣滄晥鐜囥傛湰鏂囦腑錛屽皢涓昏浠嬬粛Visual聽Studio聽2005聽鍦ㄨ皟璇曟柟闈㈡柊澧炲姞鐨勫嚑涓噸瑕佸姛鑳斤紝騫朵粙緇嶅畠浠殑綆鍗曠敤娉曘?br />銆銆
銆銆Edit聽and聽Contiue鍔熻兘
銆銆鍦ㄨ皟璇曠▼搴忕殑鏃跺欙紝緇忓父浼氶亣鍒拌繖鏍風殑鎯呭喌錛氬湪璋冭瘯涓澶ф浠g爜鏃訛紝閬囧埌浜嗕竴涓皬鐨勯敊璇紝姣斿鍙傛暟鐨勮祴鍊奸敊璇簡錛岃繖鏃跺欙紝寰寰甯屾湜鑳藉椹笂灝嗚繖浜涘皬鐨勯敊璇敼姝h繃鏉ュ悗錛岃兘澶熺戶緇皟璇曡窡韙笅鍘伙紝鑰屼笉鐢ㄧ粨鏉熸暣涓皟璇曡繃紼嬪幓淇敼銆傚湪Visual聽Studio聽2003涓紝鎴戜滑蹇呴』鍋滄褰撳墠鐨勮皟璇曪紝淇敼閿欒鐨勫湴鏂癸紝鍐嶉噸鏂扮紪璇戯紝榪欐牱鍗佸垎涓嶆柟渚褲傚湪Visual聽Studio聽2005聽涓紝鎻愪緵浜嗕竴涓柊鐨勫姛鑳藉彨"edit聽and聽continue"錛屾剰鎬濇槸璇達紝褰撲綘鍦ㄨ皟璇曟椂錛岄亣鍒板皬鐨勯敊璇渶瑕侀┈涓婁慨鏀瑰悗錛屽彲浠ヨ繘琛岀紪杈戜慨鏀癸紝鐒跺悗緇х畫寰涓嬭皟璇曪紝涓嶉渶瑕佺粨鏉熸暣涓皟璇曠殑榪囩▼錛屽綋浣犱慨鏀瑰悗錛岃皟璇曞櫒鍦ㄥ悗鍙拌繘琛屼簡鑷姩鐨勭紪璇戯紝騫朵笖浼氭墽琛屾柊淇敼鐨勪唬鐮侊紝鍗佸垎鏂逛究銆備笅闈婦涓緥瀛愯繘琛岃鏄庛偮?br />
銆銆鎵撳紑Visual聽Studio聽2005,浣跨敤c#寤虹珛涓涓獁inform紿椾綋搴旂敤紼嬪簭錛屽湪紿椾綋涓坊鍔犱竴涓猯abel鏍囩錛屼竴涓枃鏈錛屼竴涓寜閽紝濡備笅鍥炬墍紺猴紝鎴戜滑瑕佸疄鐜扮殑鍔熻兘鏄紝鍦ㄦ枃鏈杈撳叆涓浜涗俊鎭悗錛岀偣鎸夐挳錛屼細寮瑰嚭涓涓秷鎭錛屾樉紺虹殑鏄垰鎵嶈緭鍏ョ殑淇℃伅銆?br />聽聽聽聽
聽鍋囧鎴戜滑緙栧啓鐨勪唬鐮佸涓嬫墍紺猴紝鍑虹幇浜嗕竴涓皬閿欒錛屾妸textbox1.text鐨勫唴瀹瑰綋浣滃瓧絎︿覆鐨勪竴閮ㄥ垎浜嗭紝鎵浠ユ樉紺轟笉鍑虹敤鎴瘋緭鍏ョ殑淇℃伅銆?br />
紼嬪簭浠g爜錛?/td> | [ 澶嶅埗浠g爜鍒板壀璐存澘 ] |