Many posters are still confusing case sensitivity with case preservation, they are NOT the same thing. Case preserving means that something kept using the capitalization as it was typed. Case insensitive means that case is not relevant when comparing a string (e.g. a variable name, class name, etc).
In a case preserving system, you can use CamelCasing (or camelCasing), if the system is case insensitive, then Foo=foo, but in a case sensitive system Foo != foo.
People read mixed case text faster and more accurately than all upper or all lower case, there have been numerous studies that demonstrate that (you can google them if you want). This alone is a very strong reason for case preservation. Case preservation also provides clarity, ExpertsExchange clearly has a different connotation to the reader than ExpertSexChange and either is much clearer than expertsexchange. Case preservation is a great thing, I’m very much in favor it of.
Using only case to differentiate variable scoping is absolutely unacceptable. I don’t have as big an objection to using it to distinguish an instance vs. a class, but I do think it’s a poor practice.
As I mentioned in a previous post, case sensitivity is sometimes necessary and appropriate, however, I’m opposed to case sensitivity in most instances.
In fact, for clarity, I’m going to stop using the terms case sensitive and case insensitive and start using case dependent and case independent.
Variable, class, function, procedure names should not be case dependent. Program names, command line parameters, and program input should not be case dependent, EXCEPT when necessary and appropriate.
In a well designed case preserving, case independent system with an editor that provides auto-completion, you get the best of both. All variable/function/procedure/class name is converted so that all instances have the same case. It is preferable that all instances are converted to use the case used when the object was declared or defined, that way the developer only has to worry about getting the case correct one time, and all other instances will be converted to match that one.
The only thing you can’t do in that environment is use ONLY case to differentiate the scope (or differentiate between an instance and a class). For instance, you can’t use var client = new Client You can still use case to differentiate a class, instance, or scope, but you can’t use ONLY case. For example, you can use var curClient = new Client. You can also use Hungarian notation.
This allows for writing very readable code that is more maintainable by another developer. It also creates code that is portable to another system/language while minimizing the problems of different variable scoping rules, syntax differences, etc.