'භාවිතා කිරීම' විධානයන් නාම අවකාශය තුළ හෝ පිටත තිබිය යුතුද?


2074

මම සමහර C # කේත හරහා ස්ටයිල්කොප් ධාවනය කර ඇති අතර , එය මගේ usingනියමයන් නාම අවකාශය තුළ තිබිය යුතු බව වාර්තා කරයි .

usingනාම අවකාශයෙන් පිටත වෙනුවට විධානයන් ඇතුලත් කිරීමට තාක්ෂණික හේතුවක් තිබේද?


4
සමහර විට ඔබ භාවිතා කරන ස්ථානයෙහි
gius

82
යොමු කිරීම සඳහා, එක් ගොනුවකට බහුවිධ පංති පිළිබඳ ප්‍රශ්නයට එහා ගිය ඇඟවුම් තිබේ, එබැවින් ඔබ මෙම ප්‍රශ්නයට අලුත් නම් කරුණාකර කියවීම දිගටම කරගෙන යන්න.
චාලි

3
@ user-12506 - යම් මට්ටමක කේත අනුකූලතාවක් අවශ්‍ය වන මධ්‍යම සිට විශාල සංවර්ධන කණ්ඩායම දක්වා මෙය ඉතා හොඳින් ක්‍රියා නොකරයි. කලින් සඳහන් කළ පරිදි, ඔබට විවිධ පිරිසැලසුම් තේරෙන්නේ නැත්නම්, ඔබ අපේක්ෂා කළ පරිදි ක්‍රියාත්මක නොවන අද්දර අවස්ථා සොයාගත හැකිය.
benPearce

35
පාරිභාෂිතය: ඒවා using ප්‍රකාශ නොවේ ; ඒවා using නියෝග . ඒ usingප්රකාශය, අනිත් අතට, ඇත උදාහරණයක් ලෙස ක්රමයක් ශරීරය ආදිය තුළ තවත් ප්රකාශ සමග සිදුවන භාෂාව ව්යුහය, using (var e = s.GetEnumerator()) { /* ... */ }ලිහිල්ව සමාන බව ප්රකාශයක් var e = s.GetEnumerator(); try { /* ... */ } finally { if (e != null) { e.Dispose(); } }.
ජෙප් ස්ටිග් නීල්සන්

1
මෙය දැනටමත් කිසිවෙකු විසින් සඳහන් කර නොමැති නම්, ඇත්ත වශයෙන්ම මයික්‍රොසොෆ්ට් සමාගම ද ඔවුන්ගේ අභ්‍යන්තර කේතකරණ මාර්ගෝපදේශ වලusing ප්‍රකාශයන් ඇතුලත් කිරීමට නිර්දේශ කරයිnamespace
user1451111

Answers:


2139

ඇත්ත වශයෙන්ම මේ දෙක අතර (සියුම්) වෙනසක් ඇත. File1.cs හි ඔබට පහත කේතය ඇතැයි සිතන්න:

// File1.cs
using System;
namespace Outer.Inner
{
    class Foo
    {
        static void Bar()
        {
            double d = Math.PI;
        }
    }
}

දැන් හිතන්න කවුරුහරි මේ වගේ ව්‍යාපෘතියට තවත් ගොනුවක් (File2.cs) එකතු කරනවා:

// File2.cs
namespace Outer
{
    class Math
    {
    }
}

සම්පාදකයා නාම අවකාශයෙන් පිටත Outerඑම usingවිධානයන් බැලීමට පෙර සොයයි , එබැවින් එය Outer.Mathවෙනුවට සොයා ගනී System.Math. අවාසනාවට (හෝ සමහර විට වාසනාවකටද?), Outer.Mathඑහි PIසාමාජිකයෙකු නොමැත , එබැවින් File1 දැන් කැඩී ඇත.

usingපහත දැක්වෙන පරිදි ඔබේ නාම අවකාශ ප්‍රකාශය ඇතුලත තැබුවහොත් මෙය වෙනස් වේ:

// File1b.cs
namespace Outer.Inner
{
    using System;
    class Foo
    {
        static void Bar()
        {
            double d = Math.PI;
        }
    }
}

දැන් සම්පාදකයා සෙවීමට Systemපෙර සෙවීම Outer, සොයා ගැනීම System.Mathසහ සියල්ල හොඳින් ය.

සමහරු තර්ක කරනුයේ Mathඑය පරිශීලක අර්ථ දක්වන ලද පන්තියකට නරක නමක් විය හැකි බැවිනි System. මෙහි අවස්ථාවක එහි පමණක් බව ය යනු වෙනසක්, සහ එය ඔබගේ කේතය වන maintainability බලපායි.

Fooනාම අවකාශයේ Outerනොව සිදුවන්නේ කුමක් ද යන්න සටහන් කිරීම ද සිත්ගන්නා කරුණකි Outer.Inner. එවැනි අවස්ථාවකදී, Outer.Mathෆයිල් 2 හි එක් කිරීම කොතැනට ගියත් ෆයිල් 1 බිඳ දමයි using. මෙයින් ගම්‍ය වන්නේ සම්පාදකයා කිසියම් usingවිධානයක් බැලීමට පෙර අභ්‍යන්තරයේ ඇති නාම අවකාශය සොයන බවයි.


29
මාක්ගේ බහු-නාම අවකාශ-එක්-ගොනුවේ තර්කයට වඩා දේශීයව ප්‍රකාශ භාවිතා කිරීමට මෙය හොඳ හේතුවකි. විශේෂයෙන් සම්පාදනයට නම් කිරීමේ ගැටුම ගැන පැමිණිලි කළ හැකිය (මෙම රීතිය සඳහා ස්ටයිල්කොප් ප්‍රලේඛනය බලන්න (උදා: ජරෙඩ් විසින් පළ කරන ලද පරිදි).
ඩේවිඩ් ෂ්මිට්

149
පිළිගත් පිළිතුර හොඳයි, නමුත් මට නම් භාවිතා කරන වගන්ති නාම අවකාශයෙන් පිටත තැබීමට හොඳ හේතුවක් ලෙස පෙනේ . මම නම් අවකාශයේ පිටත නම්.ඉනර් එය ගණිත පන්තිය uter ටර්.ඉන්නර් වෙතින් භාවිතා කරනු ඇතැයි මම බලාපොරොත්තු වෙමි.
ෆ්‍රෑන්ක් වොලිස්

7
මමත් මේකට එකඟයි. පිළිගත් පිළිතුර නිවැරදි වන්නේ එය තාක්‍ෂණිකව වෙනස විස්තර කරන බැවිනි. කෙසේ වෙතත්, එක් හෝ වෙනත් පන්තියට පැහැදිලි ඇමතුමක් අවශ්‍ය වේ. මගේ දේශීය පන්තියට "ගණිතය" අධිෂ් have ාන කර ගැනීමට මට බොහෝ සෙයින් ඉඩ ඇති අතර, "System.Math" යන්න බාහිර පන්තියට යොමු කරයි - System.Math පිටත "ගණිතය" ලෙස භාවිතා කළද uter ටර්.මාත් පැවතුනි. ඔව්, කලින් සඳහන් කළ වාර ගණනක් නිවැරදි කිරීම වඩා වැඩකි, නමුත් එය ඉඟියක් විය හැකිය. සමහර විට uter ටර්.මාත්ට වෙනත් නමක් තිබිය යුතුය!
mbmcavoy

13
හොඳ පිළිතුරක්, නමුත් මට අවශ්‍ය වන්නේ රාමුවක් නොවන ප්‍රකාශ දේශීයව භාවිතා කිරීම පමණක් වන අතර ගෝලීයව ප්‍රකාශ භාවිතා කරමින් රාමුව තබා ගන්න. මගේ මනාපය මුළුමනින්ම වෙනස් කළ යුත්තේ මන්දැයි ඕනෑම කෙනෙකුට වැඩිදුර පැහැදිලි කිරීමක් තිබේද? VS2008 හි සැකිලි නාම අවකාශයෙන් පිටත භාවිතා කර ඇත්තේ කොහෙන්ද?
තයිමින්

31
මම හිතන්නේ මෙය ඔබ භාවිතා කරන ස්ථානය වෙනස් කරනවාට වඩා නරක නම් කිරීමේ සම්මුතියක් බවයි. ඔබේ විසඳුමේ ගණිතය නමින් පන්තියක් නොතිබිය යුතුය
jDeveloper

456

මෙම ත්‍රෙඩ් එකට දැනටමත් හොඳ පිළිතුරු කිහිපයක් ඇත, නමුත් මෙම අතිරේක පිළිතුර සමඟ මට තව ටිකක් විස්තර ගෙන ඒමට හැකි යැයි මට හැඟේ.

පළමුව, මතක තබා ගන්න කාල පරාසයන් සහිත නාම අවකාශ ප්‍රකාශයක්,

namespace MyCorp.TheProduct.SomeModule.Utilities
{
    ...
}

සම්පූර්ණයෙන්ම සමාන වේ:

namespace MyCorp
{
    namespace TheProduct
    {
        namespace SomeModule
        {
            namespace Utilities
            {
                ...
            }
        }
    }
}

ඔබට අවශ්‍ය නම්, ඔබට usingමෙම සියලු මට්ටම් සඳහා උපදෙස් දිය හැකිය . (ඇත්ත වශයෙන්ම, අපට අවශ්‍ය usingවන්නේ එක් ස්ථානයක පමණක් වන නමුත් එය භාෂාව අනුව නීත්‍යානුකූල වනු ඇත.)

කුමන ආකාරයේ ගම්‍යද යන්න නිරාකරණය කිරීමේ රීතිය මේ ආකාරයට ලිහිල් ලෙස ප්‍රකාශ කළ හැකිය: පළමුව තරඟයක් සඳහා අභ්‍යන්තර-වඩාත්ම “විෂය පථය” සොයන්න, කිසිවක් සොයාගත නොහැකි නම්, එක් මට්ටමකින් ඊළඟ විෂය පථයට ගොස් එහි සොයන්න, සහ එසේ ය . තරඟයක් සොයා ගන්නා තුරු. කිසියම් මට්ටමකට එකකට වඩා වැඩි ප්‍රමාණයක් හමු වුවහොත්, එක් වර්ගයක් වත්මන් එකලස් කිරීමේ සිට නම්, එය තෝරාගෙන සම්පාදක අනතුරු ඇඟවීමක් කරන්න. එසේ නොමැතිනම් අත්හරින්න (සම්පාදක කාල දෝෂය).

දැන්, ප්‍රධාන සම්මුතීන් දෙක සමඟ සංයුක්ත උදාහරණයකින් මෙයින් අදහස් කරන්නේ කුමක්ද යන්න පිළිබඳව පැහැදිලිව කියමු.

(1) පිටත භාවිතයන් සමඟ:

using System;
using System.Collections.Generic;
using System.Linq;
//using MyCorp.TheProduct;  <-- uncommenting this would change nothing
using MyCorp.TheProduct.OtherModule;
using MyCorp.TheProduct.OtherModule.Integration;
using ThirdParty;

namespace MyCorp.TheProduct.SomeModule.Utilities
{
    class C
    {
        Ambiguous a;
    }
}

ඉහත අවස්ථාවේ දී, වර්ගය කුමක්දැයි සොයා ගැනීමට Ambiguous, සෙවීම මෙම අනුපිළිවෙලට යයි:

  1. ඇතුළත Cකැදැලි වර්ග (උරුම වූ කැදැලි වර්ග ඇතුළුව)
  2. වත්මන් නාම අවකාශයේ වර්ග MyCorp.TheProduct.SomeModule.Utilities
  3. නාම අවකාශයේ වර්ග MyCorp.TheProduct.SomeModule
  4. වර්ග MyCorp.TheProduct
  5. වර්ග MyCorp
  6. ශුන්‍ය නාම අවකාශයේ වර්ග (ගෝලීය නාම අවකාශය)
  7. දී වර්ග System, System.Collections.Generic, System.Linq, MyCorp.TheProduct.OtherModule, MyCorp.TheProduct.OtherModule.Integration, සහThirdParty

අනෙක් සම්මුතිය:

(2) ඇතුළත භාවිතයන් සමඟ:

namespace MyCorp.TheProduct.SomeModule.Utilities
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using MyCorp.TheProduct;                           // MyCorp can be left out; this using is NOT redundant
    using MyCorp.TheProduct.OtherModule;               // MyCorp.TheProduct can be left out
    using MyCorp.TheProduct.OtherModule.Integration;   // MyCorp.TheProduct can be left out
    using ThirdParty;

    class C
    {
        Ambiguous a;
    }
}

දැන්, වර්ගය සෙවීම Ambiguousමෙම අනුපිළිවෙලට යයි:

  1. ඇතුළත Cකැදැලි වර්ග (උරුම වූ කැදැලි වර්ග ඇතුළුව)
  2. වත්මන් නාම අවකාශයේ වර්ග MyCorp.TheProduct.SomeModule.Utilities
  3. දී වර්ග System, System.Collections.Generic, System.Linq, MyCorp.TheProduct, MyCorp.TheProduct.OtherModule, MyCorp.TheProduct.OtherModule.Integration, සහThirdParty
  4. නාම අවකාශයේ වර්ග MyCorp.TheProduct.SomeModule
  5. වර්ග MyCorp
  6. ශුන්‍ය නාම අවකාශයේ වර්ග (ගෝලීය නාම අවකාශය)

( MyCorp.TheProductඑය "3" හි කොටසක් වූ අතර එබැවින් "4" සහ "5" අතර අවශ්‍ය නොවීය.)

සමාප්ති සටහන්

ඔබ නාම අවකාශ ප්‍රකාශය ඇතුළත හෝ පිටත භාවිතා කළත් කමක් නැත, යමෙකු පසුව වැඩි ප්‍රමුඛතාවයක් ඇති නාම අවකාශයන්ගෙන් එකකට සමාන නමක් සහිත නව වර්ගයක් එකතු කිරීමේ හැකියාව සෑම විටම පවතී.

එසේම, කැදැලි නාම අවකාශයකට වර්ගයකට සමාන නමක් තිබේ නම්, එය ගැටළු ඇති කළ හැකිය.

සෙවුම් ධූරාවලිය වෙනස් වන නිසා සහ වෙනත් වර්ගයක් සොයා ගත හැකි නිසා භාවිතයන් එක් ස්ථානයක සිට තවත් ස්ථානයකට ගෙන යාම සැමවිටම භයානක ය. එමනිසා, එක් සමුළුවක් තෝරාගෙන එයට ඇලී සිටින්න, එවිට ඔබට කිසි විටෙකත් භාවිතයන් ගෙනයාමට සිදු නොවේ.

විෂුවල් ස්ටුඩියෝ හි සැකිලි, පෙරනිමියෙන්, භාවිතයන් නාම අවකාශයෙන් පිටත තබන්න (නිදසුනක් ලෙස ඔබ VS නව ගොනුවක් තුළ නව පන්තියක් ජනනය කරන්නේ නම්).

පිටත භාවිතයේ ඇති එක් (කුඩා) වාසියක් නම්, ඔබට පසුව ගෝලීය ගුණාංගයක් සඳහා භාවිතා කරන විධානයන් භාවිතා කළ හැකිය, උදාහරණයක් [assembly: ComVisible(false)]ලෙස [assembly: System.Runtime.InteropServices.ComVisible(false)].


46
මෙය හොඳම පැහැදිලි කිරීමකි, මන්ද එය 'භාවිතා කිරීමේ' ප්‍රකාශවල පිහිටීම සංවර්ධකයාගේ හිතාමතා ගත් තීරණයක් බව අවධාරණය කරයි. කිසිම අවස්ථාවක යමෙකු ඇඟවුම් තේරුම් නොගෙන 'භාවිතා කිරීමේ' ප්‍රකාශයේ පිහිටීම නොසැලකිලිමත් ලෙස වෙනස් නොකළ යුතුය. එබැවින් ස්ටයිල්කොප් රීතිය ගොළු ය.
ZunTzu

194

එය නාම අවකාශය තුළ තැබීම මඟින් ගොනුව සඳහා එම නාම අවකාශයට දේශීය ප්‍රකාශනය කරයි (ඔබට ගොනුවේ බහු නාම අවකාශයක් තිබේ නම්) නමුත් ඔබට එක් ගොනුවකට එක් නාම අවකාශයක් පමණක් තිබේ නම් ඒවා පිටතට ගියත් නැතත් විශාල වෙනසක් සිදු නොවේ. නාම අවකාශය තුළ.

using ThisNamespace.IsImported.InAllNamespaces.Here;

namespace Namespace1
{ 
   using ThisNamespace.IsImported.InNamespace1.AndNamespace2;

   namespace Namespace2
   { 
      using ThisNamespace.IsImported.InJustNamespace2;
   }       
}

namespace Namespace3
{ 
   using ThisNamespace.IsImported.InJustNamespace3;
}

නාම අවකාශයන් තාර්කික වෙන්වීමක් සපයයි, භෞතික (ගොනුවක්) නොවේ.
ජෝවන්

9
වෙනසක් නැති බව තරමක් සත්‍ය නොවේ; කුට්ටි usingතුළ ඇති විධානයන්ට namespaceකොටු කිරීමේ namespaceකොටස මත පදනම්ව සාපේක්ෂ නාම අවකාශයන් වෙත යොමු විය හැකිය .
හෝ සිතියම්

70
ඔව් මම දන්නවා. මීට වසර පහකට පෙර මෙම ප්‍රශ්නයේ පිළිගත් පිළිතුරෙන් අපි එය තහවුරු කළෙමු.
මාර්ක් සිඩාඩ්

60

හැන්සල්මන්ට අනුව - ඩිරෙක්ටිව් සහ එකලස් පැටවීම භාවිතා කිරීම ... සහ වෙනත් එවැනි ලිපි තාක්ෂණික වශයෙන් වෙනසක් නැත.

මගේ මනාපය නම් ඒවා නාම අවකාශයෙන් පිටත තැබීමයි.


3
H ක්‍රිස් එම්: අහ් ... පිළිතුරෙහි පළ කර ඇති සබැඳිය පෙන්නුම් කරන්නේ එදිරිව එදිරිව සිටීමෙන් කිසිදු ප්‍රතිලාභයක් නොමැති බවයි, ඇත්ත වශයෙන්ම ඔබ පළ කළ සබැඳියේ හිමිකම් පෑම ව්‍යාජ ලෙස පෙන්වන උදාහරණයක් පෙන්වයි ...
ජොනී

2
ඔව්, මම ත්‍රෙඩ් එක සම්පූර්ණයෙන් කියවා නැති නමුත් එම්.වී.පී. පිරිමි ළමයෙක් එය සනාථ කරයි, එය පැහැදිලි කරයි සහ ඔහුගේ කේතය තව දුරටත් පෙන්වයි ... "සී # සම්පාදකයා ජනනය කරන අයිඑල් එක දෙකටම එක හා සමාන වේ. ඇත්ත වශයෙන්ම සී # සම්පාදකයා විසින් එක් එක් විධානයන් භාවිතා කරමින් නිශ්චිතවම අනුරූප කිසිවක් ජනනය නොකරයි. විධානයන් භාවිතා කිරීම තනිකරම a C # ism, සහ ඒවාට .NET යන්නටම තේරුමක්
ක්‍රිස් මැකී

84
කරුණාකර සබැඳියේ සාරාංශයක් ඇතුළත් කරන්න. විට (එය නිසා මෙම සබැඳිය කැඩී ඇත ඇත සිදු, ඇති තරම් කාලය ලබා දී), upvotes 32 හදිසියේ පිළිතුරක් පමණක් වටී My style is to put them outside the namespaces.- සියලු දී යන්තම් පිළිතුරක්.
ANeves

11
මෙහි හිමිකම් පෑම සරලවම වැරදියි ... තාක්ෂණික වෙනසක් ඇති අතර ඔබේම උපුටා දැක්වීමක් එසේ කියයි ... ඇත්ත වශයෙන්ම එය එයයි. කරුණාකර මෙම වැරදි පිළිතුර මකා දමන්න ... වඩා හොඳ සහ නිවැරදි ඒවා තිබේ.
ජිම් බෝල්ටර්

53

ස්ටයිල්කොප් ප්‍රලේඛනයට අනුව:

SA1200: DirectDirectivesMustBePlacedWithinNamespace භාවිතා කිරීම

හේතුව AC # විධානය භාවිතා කිරීම නාම අවකාශයක මූලද්‍රව්‍යයෙන් පිටත තබා ඇත.

රීති විස්තරය ගොනුවේ කිසිදු නාම අවකාශ මූලද්‍රව්‍යයක් නොමැති නම්, නාම අවකාශයක මූලද්‍රව්‍යයෙන් පිටත භාවිතා කරන විධානයක් හෝ අන්වර්ථ නාමයක් භාවිතා කරන විට මෙම රීතිය උල්ලං violation නය වේ.

උදාහරණයක් ලෙස, පහත දැක්වෙන කේතය මෙම රීතිය උල්ලං lations නය කිරීම් දෙකකට හේතු වේ.

using System;
using Guid = System.Guid;

namespace Microsoft.Sample
{
    public class Program
    {
    }
}

කෙසේ වෙතත්, පහත දැක්වෙන කේතය මෙම රීතිය උල්ලං in නය කිරීමක් සිදු නොකරනු ඇත:

namespace Microsoft.Sample
{
    using System;
    using Guid = System.Guid;

    public class Program
    {
    }
}

මෙම කේතය කිසිදු සම්පාදක දෝෂයකින් තොරව පිරිසිදු ලෙස සම්පාදනය කරනු ඇත. කෙසේ වෙතත්, මාර්ගෝපදේශ වර්ගයේ කුමන අනුවාදය වෙන් කරන්නේද යන්න පැහැදිලි නැත. පහත දැක්වෙන පරිදි, භාවිතා කිරීමේ විධානය නාම අවකාශය තුළට ගෙන යන්නේ නම්, සම්පාදක දෝෂයක් සිදුවනු ඇත:

namespace Microsoft.Sample
{
    using Guid = System.Guid;
    public class Guid
    {
        public Guid(string s)
        {
        }
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            Guid g = new Guid("hello");
        }
    }
}

පහත දැක්වෙන සම්පාදක දෝෂය මත කේතය අසමත් වේ Guid g = new Guid("hello");

CS0576: නාම අවකාශය 'Microsoft.Sample' හි අන්වර්ථ නාමයක් වන 'Guid' සමඟ ගැටෙන අර්ථ දැක්වීමක් අඩංගු වේ.

මෙම කේතය System.Guid වර්ගයට Guid ලෙස අන්වර්ථයක් නිර්මාණය කරයි, එසේම ගැලපෙන ඉදිකිරීම් අතුරුමුහුණතක් සහිත Guid නමින් තමන්ගේම වර්ගයක් නිර්මාණය කරයි. පසුව, කේතය මඟින් ගයිඩ් වර්ගය පිළිබඳ උදාහරණයක් නිර්මාණය කරයි. මෙම අවස්ථාව නිර්මාණය කිරීම සඳහා, සම්පාදකයා විසින් මාර්ගෝපදේශයේ වෙනස් අර්ථකථන දෙක අතර තෝරා ගත යුතුය. භාවිතා කිරීමේ-අන්වර්ථ විධානය නාම අවකාශයේ මූලද්‍රව්‍යයෙන් පිටත තැබූ විට, සම්පාදකයා විසින් දේශීය නාම අවකාශය තුළ නිර්වචනය කර ඇති මාර්ගෝපදේශයේ දේශීය අර්ථ දැක්වීම තෝරා ගනු ඇති අතර නාම අවකාශයෙන් පිටත අර්ථ දක්වා ඇති භාවිතා කිරීමේ අන්වර්ථ නියෝගය සම්පූර්ණයෙන්ම නොසලකා හරිනු ඇත. අවාසනාවට, කේතය කියවීමේදී මෙය පැහැදිලිව පෙනෙන්නට නැත.

කෙසේ වෙතත්, භාවිතා කිරීමේ-අන්වර්ථ විධානය නාම අවකාශය තුළ ස්ථානගත කර ඇති විට, සම්පාදකයාට එකම නාම අවකාශය තුළ අර්ථ දක්වා ඇති වෙනස්, ගැටුම් සහිත මාර්ගෝපදේශ වර්ග දෙකක් තෝරා ගත යුතුය. මෙම වර්ග දෙකම ගැලපෙන ඉදිකිරීම්කරුවෙකු සපයයි. සම්පාදකයාට තීරණයක් ගැනීමට නොහැකි නිසා එය සම්පාදක දෝෂය සලකුණු කරයි.

නාම අවකාශයෙන් පිටත භාවිතා කිරීම-අන්වර්ථ නියෝගය තැබීම නරක පුරුද්දකි, මන්දයත් මෙවැනි තත්වයන් තුළ ව්‍යාකූලත්වයට හේතු විය හැකි අතර, ඇත්ත වශයෙන්ම කුමන වර්ගයේ අනුවාදයක් භාවිතා කරන්නේද යන්න පැහැදිලි නැත. මෙය දෝෂ හඳුනා ගැනීමට අපහසු විය හැකි දෝෂයකට තුඩු දිය හැකිය.

නාම අවකාශයේ මූලද්‍රව්‍යය තුළ අන්වර්ථ නාම භාවිතා කිරීමෙන් මෙය දෝෂ ප්‍රභවයක් ලෙස ඉවත් කරයි.

  1. බහු නාම අවකාශයන්

එක් ගොනුවක් තුළ බහු නාම මූලද්‍රව්‍ය තැබීම සාමාන්‍යයෙන් නරක අදහසකි, නමුත් මෙය සිදු කළ විට සහ භාවිතා කරන විට, ගෝලීයව ගොනුවේ ඉහළින් නොව, සෑම නාම අවකාශයකම භාවිතා කරන සියලු විධානයන් තැබීම හොඳ අදහසකි. මෙය නාම අවකාශයන් තදින් විෂය පථයට යොමු කරනු ඇති අතර, ඉහත විස්තර කර ඇති ආකාරයේ හැසිරීම් වලක්වා ගැනීමට ද උපකාරී වේ.

නාම අවකාශයෙන් පිටත තබා ඇති විධානයන් භාවිතා කරමින් කේතය ලියා ඇති විට, මෙම විධානයන් නාම අවකාශය තුළට ගෙන යන විට සැලකිලිමත් විය යුතු අතර, මෙය කේතයේ අර්ථ නිරූපණය වෙනස් නොවන බවට වග බලා ගත යුතුය. ඉහත විස්තර කර ඇති පරිදි, නාම අවකාශයේ මූලද්‍රව්‍යය තුළ අන්වර්ථ නාම භාවිතා කිරීම සම්පාදකයාට නාම අවකාශයෙන් පිටත විධානයන් තැබූ විට සිදු නොවන ආකාරයෙන් ගැටුම් වර්ග අතර තෝරා ගැනීමට ඉඩ දෙයි.

උල්ලං lations නයන් නිවැරදි කරන්නේ කෙසේද මෙම රීතිය උල්ලං violation නය කිරීමක් නිවැරදි කිරීම සඳහා, නාම අවකාශයේ මූලද්‍රව්‍යය තුළ ඇති සියලුම විධානයන් සහ අන්වර්ථ නාමයන් භාවිතා කරන්න.


1
@ ජරෙඩ් - මගේ පිළිතුරේ මා සඳහන් කළ පරිදි, මගේ මනාපය සහ විසඳුම වන්නේ එක් ගොනුවකට එක් පන්තියක් පමණක් තිබීමයි. මෙය තරමක් පොදු සම්මුතියක් යැයි මම සිතමි.
benPearce

24
ඇත්ත වශයෙන්ම, එය ද ස්ටයිල්කොප් රීතියකි! SA1402: AC # ලේඛනයේ අඩංගු විය හැක්කේ සියලුම පන්ති අර්ධ හා එකම වර්ගයට අයත් නොවන්නේ නම් මූල මට්ටමින් තනි පන්තියක් පමණි. එක් රීතියක් පෙන්වීමෙන් තවත් රීතියක් කඩමින් වැරදි සෝස් සමඟ බින්දු කරයි.
කාර්යය

6
එය ස්ටයිල්කොප් දෘෂ්ටිකෝණයෙන් සැබවින්ම ආවරණය කිරීමට පළමු පිළිතුර ලෙස උසස් කර ඇත. පුද්ගලිකව මම usingනාම අවකාශයෙන් පිටත s හි දෘශ්‍ය හැඟීමට කැමතියි . ඇතුළත usingපෙනුම මට හරිම කැතයි. :)
නව්ෆල්

2
අවසාන වශයෙන් ප්රශ්නයට හොඳ පිළිතුරක්. බෙන්පියර්ස්ගේ ප්‍රකාශය අදාල නොවේ ... මෙය ගොනුවේ ඇති පන්ති ගණන සමඟ කිසිදු සම්බන්ධයක් නැත.
ජිම් බෝල්ටර්

35

ඔබට අන්වර්ථ නාම භාවිතා කිරීමට අවශ්‍ය වූ විට නාම අවකාශය තුළ ප්‍රකාශ භාවිතා කිරීම ගැටළුවක් වේ. අන්වර්ථය කලින් සිට ප්‍රතිලාභ නොලබයිusing ප්‍රකාශ අතර පූර්ණ සුදුසුකම් ලැබිය යුතුය.

සලකා බලන්න:

namespace MyNamespace
{
    using System;
    using MyAlias = System.DateTime;

    class MyClass
    {
    }
}

එදිරිව:

using System;

namespace MyNamespace
{
    using MyAlias = DateTime;

    class MyClass
    {
    }
}

ඔබට පහත සඳහන් දෑ වැනි දිගු සුළං සහිත අන්වර්ථයක් තිබේ නම් මෙය විශේෂයෙන් උච්චාරණය කළ හැකිය (එයයි මා ගැටලුව සොයාගත්තේ):

using MyAlias = Tuple<Expression<Func<DateTime, object>>, Expression<Func<TimeSpan, object>>>;

usingනාම අවකාශය තුළ ප්‍රකාශ සමඟ , එය හදිසියේම බවට පත්වේ:

using MyAlias = System.Tuple<System.Linq.Expressions.Expression<System.Func<System.DateTime, object>>, System.Linq.Expressions.Expression<System.Func<System.TimeSpan, object>>>;

ලස්සන නැහැ.


1
ඔබට classනමක් අවශ්‍යයි (හඳුනාගැනීමක්). ඔබ පවසන usingපරිදි පන්තියක් තුළ ඔබට නියෝගයක් තිබිය නොහැක . එය නාම අවකාශ මට්ටමක තිබිය යුතුය, නිදසුනක් ලෙස පිටත namespaceකෙළවරේ හෝ අභ්‍යන්තරයේ ඇතුළත namespace(නමුත් පන්තියක් / අතුරු මුහුණතක් / යනාදිය තුළ නොවේ).
ජෙප් ස්ටිග් නීල්සන්

Ep ජෙප්ස්ටිග්නිල්සන් ස්තූතියි. මම usingනියෝග වැරදියට වැරදුණා. මම එය සංස්කරණය කළේ මා එය කෙසේ විය යුතුද යන්නයි. පෙන්වා දීමට ස්තූතියි. තර්කය තවමත් එසේමය.
නියෝ

4

ජෙප් ස්ටිග් නීල්සන් පැවසූ පරිදි , මෙම නූලට දැනටමත් හොඳ පිළිතුරු ඇත, නමුත් මම සිතුවේ මෙම පැහැදිලිව පෙනෙන සියුම්කම ද සඳහන් කිරීම වටී.

using නාම අවකාශයන් තුළ දක්වා ඇති විධානයන් කෙටි කේතයක් සෑදිය හැකි බැවින් ඒවා පිටතින් නිශ්චිතව දක්වා ඇති ආකාරයට පූර්ණ සුදුසුකම් ලැබිය යුතු නොවේ.

පහත දැක්වෙන උදාහරණය ක්‍රියාත්මක වන්නේ වර්ග Fooසහ Barදෙකම එකම ගෝලීය නාම අවකාශයේ පවතින බැවිනි.Outer බැවිනි.

, අනුමාන කේතය ගොනුව Foo.cs :

namespace Outer.Inner
{
    class Foo { }
}

සහ Bar.cs :

namespace Outer
{
    using Outer.Inner;

    class Bar
    {
        public Foo foo;
    }
}

usingකෙටියෙන් කිවහොත්, විධානයෙහි පිටත නාම අවකාශය මඟ හැරිය හැක :

namespace Outer
{
    using Inner;

    class Bar
    {
        public Foo foo;
    }
}

8
ඔබ "පිටත නාම අවකාශය මඟ හැරිය හැකි" බව සත්‍යයකි, නමුත් එයින් අදහස් කරන්නේ ඔබ එසේ කළ යුතු බවයි. මට නම්, මෙය තවත් තර්කයක් වන්නේ පූර්ණ සුදුසුකම් සහිත නාම අවකාශ නාමයන් බල කිරීම සඳහා විධානයන් භාවිතා කිරීම (@ නියෝගේ පිළිතුරෙහි ඇති අන්වර්ථ නාම හැර) නාම අවකාශයෙන් පිටත යා යුත්තේ මන්ද යන්නයි.
කීත් රොබට්සන්

4

එක් රැල්ලක් මා තුළට දිව ගියේය (එය වෙනත් පිළිතුරු වලින් ආවරණය නොවේ):

ඔබට මෙම නාම අවකාශයන් ඇතැයි සිතමු:

  • වෙනත් දෙයක්
  • දෙමාපිය

ඔබ using Something.Other පිටත භාවිතා කරන විට anamespace Parent , එය පළමු එක (යමක්. වෙනත්) වෙත යොමු වේ.

කෙසේ වෙතත් ඔබ එය ඇතුළත භාවිතා කරන්නේ නම් එම නාම අවකාශයේ ප්‍රකාශනය , එය යොමු දක්වන්නේ දෙවැන්න (දෙමාපිය. යම් දෙයක්. වෙනත්)!

සරල විසඳුමක් ඇත: " global::" උපසර්ගය එක් කරන්න : ලියකියවිලි

namespace Parent
{
   using global::Something.Other;
   // etc
}

2

තාක්‍ෂණික හේතූන් පිළිතුරු වල සාකච්ඡා කර ඇති අතර වෙනස එතරම් විශාල නොවන නිසාත් ඒ දෙකම සඳහා වෙළඳාම් ඇති නිසාත් එය අවසානයේ පෞද්ගලික මනාපයන් වෙත පැමිණෙනු ඇතැයි මම සිතමි . .csලිපිගොනු නිර්මාණය කිරීම සඳහා විෂුවල් ස්ටුඩියෝ හි පෙරනිමි අච්චුව usingනාම අවකාශයෙන් පිටත විධානයන් භාවිතා කරයි

පහත සඳහන් දෑ සමඟ ව්‍යාපෘති ගොනුවේ මූලයේ ගොනුවක් usingඑක් කිරීම මගින් නාම අවකාශයෙන් පිටත විධානයන් පරීක්ෂා කිරීමට කෙනෙකුට ස්ටයිල්කොප් සකස් කළ හැකිය stylecop.json:

{
  "$schema": "https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json",
    "orderingRules": {
      "usingDirectivesPlacement": "outsideNamespace"
    }
  }
}

ඔබට මෙම වින්‍යාස ගොනුව විසඳුම් මට්ටමින් නිර්මාණය කර ඔබගේ ව්‍යාපෘති සියල්ලටම 'පවතින සම්බන්ධක ගොනුව' ලෙස එක් කළ හැකිය.


2

අනෙක් පිළිතුරු වලින් ආවරණය වී ඇති බව මා විශ්වාස නොකරන තවත් සියුම් දෙයක් නම්, ඔබට එකම නමක් සහිත පංතියක් සහ නාම අවකාශයක් ඇති විටය.

ඔබ නාම අවකාශය තුළ ආනයනය කළ විට එය පන්තිය සොයා ගනී. ආනයනය නාම අවකාශයෙන් පිටත නම් ආනයනය නොසලකා හරිනු ලබන අතර පන්තිය සහ නාම අවකාශය පූර්ණ සුදුසුකම් ලැබිය යුතුය.

//file1.cs
namespace Foo
{
    class Foo
    {
    }
}

//file2.cs
namespace ConsoleApp3
{
    using Foo;
    class Program
    {
        static void Main(string[] args)
        {
            //This will allow you to use the class
            Foo test = new Foo();
        }
    }
}

//file2.cs
using Foo; //Unused and redundant    
namespace Bar
{
    class Bar
    {
        Bar()
        {
            Foo.Foo test = new Foo.Foo();
            Foo test = new Foo(); //will give you an error that a namespace is being used like a class.
        }
    }
}

-8

එම නම් එය වඩාත් හොඳ ක්රමයක් වන්නේ පෙරනිමිය එනම් "භාවිතා යොමු ඔබගේ මූලාශ්රය විසඳුමක් සඳහා භාවිතා කරන 'ද නාමඅවකාශයන්හි පිටත විය යුතු අතර සිටින බව එම " නව එකතු සඳහනක් " හොඳ පුරුද්දකි ඔබ නාමඅවකාශයෙහි තුල එය ඉදිරිපත් කළ යුතුය වේ. මෙය එකතු කරනු ලබන යොමු මොනවාද යන්න වෙන්කර හඳුනා ගැනීමයි.


6
නැත, ඇත්ත වශයෙන්ම එය නරක අදහසකි. දේශීයව විෂය පථය හා ගෝලීය වශයෙන් විෂය පථයන් අතර පිහිටීම පදනම් කර නොගත යුතුය. ඒ වෙනුවට, බීසීඑල් යොමුව හැරුණු විට ඒවා අකාරාදී කිරීම හොඳ පුරුද්දකි.
අබෙල්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.