格式化C#代码的普遍接受的方式似乎如下:
namespace SomeNamespace
{
namespace SomeSubNamespace
{
class SomeClass
{
void SomeFunction()
{
using (var someFile = new StreamWriter(somePath))
{
try
{
lock(someCriticalSection)
{
using (var someDisposableThing1 = new DisposableThing())
{
DoSomething();
using (var someDisposableThing2 = new DisposableThing())
{
lock(someOtherCriticalSection)
{
DoSomethingMore();
}
}
}
}
}
catch(Exception e)
{
Log(e);
}
}
}
}
}
这会浪费大量的水平和垂直屏幕空间。我肯定不是第一个注意到的人。我的问题是:你是否忍受它,或者你是否开发了不同的格式化风格以避免过多的空白区域?
PS:请注意,我甚至没有使用单个if语句!
答案 0 :(得分:19)
答案 1 :(得分:16)
让我这样解释一下。如果您碰巧遇到的嵌套代码构造与上面显示的那样深,那么问题可能不是格式化而是代码结构。
您应该考虑一下这个: Refactoring by Martin Fowler
通过 extracting methods ,您不仅可以改善“浪费”的屏幕空间,还可以显着提高可读性;)
另一种解决方案始终是: Alt + Shift + 在Visual Studio中输入以进入全屏模式
答案 2 :(得分:10)
我买了一台高清显示器;)
但除了使用更少的缩进之外,处理它的唯一方法是将一些代码移动到他们自己的方法中。
答案 3 :(得分:10)
工具>选项>文本编辑器>所有语言>标签>缩进尺寸> 1
不是一个很好的解决方案......:P
答案 4 :(得分:10)
你应该阅读Bob Martin的Clean Code。它有助于解决这个问题。在这种情况下,SomeFunction()
不止一件事。在它自己的方法中拆分它做的每件事。
namespace SomeNamespace.SomeSubNamespace
{
class SomeClass
{
void WriteToFile()
{
using (var someFile = new StreamWriter(somePath))
{
lock(someCriticalSection)
{
ExecuteCriticalSection();
}
}
}
void ExecuteCriticalSection()
{
using (var someDisposableThing1 = new DisposableThing())
{
DoSomething();
ExecuteFinalCriticalSection();
}
}
void ExecuteFinalCriticalSection()
{
using (var someDisposableThing2 = new DisposableThing())
{
lock(someOtherCriticalSection)
{
DoSomethingMore();
}
}
}
}
}
另外,不要抓住System.Exception
;你永远不知道什么会失败,你不应该试图捕捉你无法处理的异常。让他们冒泡,死得很厉害。
答案 5 :(得分:7)
我倾向于编写小类,具有较小嵌套级别的简短方法。您不仅可以在屏幕上看到所有内容,而且代码也更好!
答案 6 :(得分:5)
我有一台24英寸宽屏显示器。我非常喜欢“漂亮打印”而不是回收空间。压缩,挤压在一起的代码很难阅读并伤害我的大脑。
答案 7 :(得分:3)
如果我要尝试/抓住某些东西,我会与任何相邻的使用块组合。同样,我会聚合名称空间,所以更接近:
namespace SomeNamespace.SomeSubNamespace
{
class SomeClass
{
void SomeFunction()
{
StreamWriter someFile;
try
{
someFile = new StreamWriter(somePath);
lock(someCriticalSection)
{
using (var someDisposableThing1 = new DisposableThing())
{
DoSomething();
using (var someDisposableThing2 = new DisposableThing())
{
lock(someOtherCriticalSection)
{
DoSomethingMore();
}
}
}
}
}
catch(Exception e)
{
Log(e);
}
finally
{
if( someFile != null )
{
someFile.Dispose();
}
}
}
}
}
答案 8 :(得分:3)
不要认为它看起来那么糟糕;) 然而,缩短功能确实是一个重点。特别是,如果你可以做替换
这样的事情,那就太好了if (condition)
{
// bla
}
else
{
// blub
}
通过
void someFunction()
{
if (condition)
{
// bla
return
}
// blub
}
答案 9 :(得分:3)
我在代码块的起始行看到了开括号,如:
namespace SomeNamespace {
class SomeClass {
void SomeFunction() {
using (var someFile = new StreamWriter(somePath)) {
try {
lock(someCriticalSection) {
using (var someDisposableThing1 = new DisposableThing()) {
DoSomething();
}
}
} catch(Exception e) {
Log(e);
}
}
}
}
}
较少的房地产,但我认为它很难看。
答案 10 :(得分:3)
using语句非常方便,但如果代码变得难以阅读,则可以不使用它:
namespace SomeNamespace.SomeSubNamespace
{
class SomeClass
{
void SomeFunction()
{
StreamWriter someFile = new StreamWriter(somePath);
DisposableThing someDisposableThing1 = null;
DisposableThing someDisposableThing2 = null;
try
{
lock (someCriticalSection)
{
someDisposableThing1 = new DisposableThing();
DoSomething();
someDisposableThing2 = new DisposableThing();
lock (someOtherCriticalSection)
{
DoSomethingMore();
}
}
}
catch (Exception e)
{
Log(e);
}
finally
{
// requires SafeDispose extension method
someFile.SafeDispose();
someDisposableThing1.SafeDispose();
someDisposableThing2.SafeDispose();
}
}
}
}
答案 11 :(得分:2)
我同意其他基本上与之相关的答案 - 对于我的团队,我们要么拥有高分辨率显示器,要么配备双显示器(或两者兼有),所以它不像我们正在开发800x600。
但有一点要记住,如果你使用实际间距,你的标签会更好,因为一些开发人员使用2个空格作为标签,大约4个,大约6个。所以虽然格式化的代码在一个开发人员看来可能很好IDE,它可能在另一个上看起来不那么好。 (我从中看到了一些可怕的结果。)
VS2010有一个来自Extensions Manager的一个很好的插件,名为Productivity Tools,可以检测文件中混合使用标签和空格,并允许您将所有内容转换为标签或空格(“修复混合标签”)。它真的有助于清理你的文件(即使它看起来不像它做任何事情!)。如果您在团队之间共享代码,那就太棒了。
答案 12 :(得分:1)
使用 CodeRush , 它会更好地导航你的代码
你会得到这样的东西答案 13 :(得分:1)
除了其他人在这里所说的,我做的一件事就是减少效果,就是使用比例间距的字体。文本更具可读性,但不是那么宽。它还会强迫你在空格上使用标签进行对齐(这当然是为什么好主在一开始就给了我们标签)
我个人使用Comics Sans MS,但这确实让同事疯狂......
答案 14 :(得分:1)
一些一般性的想法:
using
个语句集中到一个地方。{}
s!”,你也可以摆脱using
和{{之间的括号1}}阻止。try..catch
,或者最外面的lock
是否足够。这些可以产生以下代码(请注意,您的假设示例代码的含义可能无法完全保留):
lock
(如果您的代码允许,您甚至可以将两个namespace SomeNamespace.SomeSubNamespace
{
class SomeClass
{
void SomeFunction()
{
using (var someFile = new StreamWriter(somePath))
try
{
lock(someCriticalSection)
{
using (var someDisposableThing1 = new DisposableThing())
using (var someDisposableThing2 = new DisposableThing())
{
DoSomething();
DoSomethingMore();
}
}
}
catch(Exception e)
{
Log(e);
}
}
}
}
移至using
之外的其他using
语句。您可以进一步替换lock
在using
块中显式调用Dispose
的语句,如另一个答案所示。)