我的观点可能有争议,但是是的,我认为在某些情况下我会使用这种风格。但是,“仅减小变量的作用域”不是有效的参数,因为这已经在做。做某事只是做这不是一个正当的理由。另请注意,如果您的团队已经解决了这种语法是否是常规语法,则此解释没有任何意义。
我主要是C#程序员,但是我听说过在Java中按原样返回密码,char[]
以减少密码在内存中的停留时间。在此示例中,它将无济于事,因为垃圾回收器被允许从不使用的那一刻起就开始收集数组,因此,密码是否离开作用域并不重要。我不是在争论完成数组后清除数组是否可行,但是在这种情况下,如果要这样做,对变量进行范围界定是有意义的:
{
char[] password = getPassword();
try{
keyStore.load(new FileInputStream(keyStoreLocation), password);
keyManager.init(keyStore, password);
}finally{
Arrays.fill(password, '\0');
}
}
这实际上与try-with-resources语句相似,因为它可以对资源进行范围划分,并在完成后对其进行终结处理。再次请注意,我不是在争辩以这种方式处理密码,只是如果您决定这样做,则这种样式是合理的。
其原因是该变量不再有效。您已经创建,使用了它,并使它的状态无效以不包含任何有意义的信息。在此块之后使用该变量没有任何意义,因此对其进行范围划分是合理的。
我可以想到的另一个示例是,当您有两个具有相同名称和含义的变量,但先使用一个变量,然后又使用另一个变量,并且希望将它们分开。我已经用C#编写了这段代码:
{
MethodBuilder m_ToString = tb.DefineMethod("ToString", MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Final, typeofString, Type.EmptyTypes);
var il = m_ToString.GetILGenerator();
il.Emit(OpCodes.Ldstr, templateType.ToString()+":"+staticType.ToString());
il.Emit(OpCodes.Ret);
tb.DefineMethodOverride(m_ToString, m_Object_ToString);
}
{
PropertyBuilder p_Class = tb.DefineProperty("Class", PropertyAttributes.None, typeofType, Type.EmptyTypes);
MethodBuilder m_get_Class = tb.DefineMethod("get_Class", MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.Final, typeofType, Type.EmptyTypes);
var il = m_get_Class.GetILGenerator();
il.Emit(OpCodes.Ldtoken, staticType);
il.Emit(OpCodes.Call, m_Type_GetTypeFromHandle);
il.Emit(OpCodes.Ret);
p_Class.SetGetMethod(m_get_Class);
tb.DefineMethodOverride(m_get_Class, m_IPattern_get_Class);
}
您可能会说我可以ILGenerator il;
在方法的顶部进行简单声明,但是我也不想将变量用于不同的对象(kinda函数方法)。在这种情况下,这些块使语法和视觉上分离执行的工作变得更加容易。它还表明,在该块之后,我已经完成了il
,没有任何内容可以访问它。
反对此示例的一个论点是使用方法。也许可以,但是在这种情况下,代码不会那么长,并且将其分为不同的方法还需要传递代码中使用的所有变量。