got another codebase to work on... its full of surprises!!!
-
public class Field
{private readonly string _field;
private readonly string _table;Field()
{}public Field(Field s)
{
_table = string.Copy(s.Table);
_field = string.Copy(s.Field);
}}
string.Copy for what?:mad:
That guy used to be a C/C++ programmer. He wants to make sure that he copies the value, instead of referencing the original value. Just think of those terrible
char *
. C--! -
That guy used to be a C/C++ programmer. He wants to make sure that he copies the value, instead of referencing the original value. Just think of those terrible
char *
. C--!What if I tell you he is an experienced C# developer:cool:
-
public class Field
{private readonly string _field;
private readonly string _table;Field()
{}public Field(Field s)
{
_table = string.Copy(s.Table);
_field = string.Copy(s.Field);
}}
string.Copy for what?:mad:
Only I noted the private default constructor that make this class impossible to instantiate? or there are more constructors?
I'm brazilian and english (well, human languages in general) aren't my best skill, so, sorry by my english. (if you want we can speak in C# or VB.Net =p)
-
Only I noted the private default constructor that make this class impossible to instantiate? or there are more constructors?
I'm brazilian and english (well, human languages in general) aren't my best skill, so, sorry by my english. (if you want we can speak in C# or VB.Net =p)
-
public class Field
{private readonly string _field;
private readonly string _table;Field()
{}public Field(Field s)
{
_table = string.Copy(s.Table);
_field = string.Copy(s.Field);
}}
string.Copy for what?:mad:
-
This has got me a little interested. By not making a copy, could that stop the GC from disposing of Field s until this instance is also ready for collection?
"You get that on the big jobs."
No - because it creates a binary copy of the string content rather than the reference: I have no idea why MS though copying an immutable object would be a necessary thing to do, but there you go1... Copying the reference could stop the GC, provided the reference didn't get dereferenced itself. 1Thinking about it, it could be handy in two cases: if there is ever a ReferenceEquals on the strings, then the copy will be different, and if the string is passed to unmanaged code which messes it up - the later being very, very nasty though. I would hand a StringBuilder instead just for safety.
Ideological Purity is no substitute for being able to stick your thumb down a pipe to stop the water
-
Verify again, it's private, i just tested to make sure. ALL members of a class are private for default, there is no exception to constructors, i just tested like this: My class:
public class Form { Form() { } }
i used a project that i was working on, so this is a MVC 3 project, my controller:
public class SurveyController : Controller { public SurveyController() { Form form = new Form(); } }
this yields this compiler error:
Error 1 'FormularioAvaliacaoSaude.Models.Formulario.Formulario()' is inaccessible due to its protection level C:\workspace\FormularioAvaliacaoSaude\FormularioAvaliacaoSaude\Controllers\PesquisaController.cs 22 31 FormularioAvaliacaoSaude
(sorry for don't translating the paths on the error message, but i fell like i'll screw it up if i do it...) by this error i make the conclusion that the default Access Modifier. ... Just run into this on MSDN:
MSDN wrote:
The declaration of the empty constructor prevents the automatic generation of a default constructor. Note that if you don't use an access modifier with the constructor it will still be private by default. However, the private modifier is usually used explicitly to make it clear that the class cannot be instantiated.
I'm brazilian and english (well, human languages in general) aren't my best skill, so, sorry by my english. (if you want we can speak in C# or VB.Net =p)
-
No - because it creates a binary copy of the string content rather than the reference: I have no idea why MS though copying an immutable object would be a necessary thing to do, but there you go1... Copying the reference could stop the GC, provided the reference didn't get dereferenced itself. 1Thinking about it, it could be handy in two cases: if there is ever a ReferenceEquals on the strings, then the copy will be different, and if the string is passed to unmanaged code which messes it up - the later being very, very nasty though. I would hand a StringBuilder instead just for safety.
Ideological Purity is no substitute for being able to stick your thumb down a pipe to stop the water
Maybe this creates another internalized copy for the string, if that is util or not, i can't say...
I'm brazilian and english (well, human languages in general) aren't my best skill, so, sorry by my english. (if you want we can speak in C# or VB.Net =p)
-
Maybe this creates another internalized copy for the string, if that is util or not, i can't say...
I'm brazilian and english (well, human languages in general) aren't my best skill, so, sorry by my english. (if you want we can speak in C# or VB.Net =p)
String.Copy does create a new internal copy of the string data (rather than copy the reference as a normal string assignment would). That is precisely why the original code is so bad! It creates unnecessary copies of the string data for no obvious reason where an assignment would be faster, better for memory use, and easier to read... :laugh:
Ideological Purity is no substitute for being able to stick your thumb down a pipe to stop the water
-
String.Copy does create a new internal copy of the string data (rather than copy the reference as a normal string assignment would). That is precisely why the original code is so bad! It creates unnecessary copies of the string data for no obvious reason where an assignment would be faster, better for memory use, and easier to read... :laugh:
Ideological Purity is no substitute for being able to stick your thumb down a pipe to stop the water
So the
String.Copy()
must be used if one wants to pass a string to a P/Invoke call? i don't get why this would be better than passing aStringBuilder
... well, i've got to far ;PI'm brazilian and english (well, human languages in general) aren't my best skill, so, sorry by my english. (if you want we can speak in C# or VB.Net =p)
-
So the
String.Copy()
must be used if one wants to pass a string to a P/Invoke call? i don't get why this would be better than passing aStringBuilder
... well, i've got to far ;PI'm brazilian and english (well, human languages in general) aren't my best skill, so, sorry by my english. (if you want we can speak in C# or VB.Net =p)
Gawd no! Use a StringBuilder instead! Passing an immutable object to a function known to change it is very nasty indeed (as I said earlier).
Ideological Purity is no substitute for being able to stick your thumb down a pipe to stop the water
-
Gawd no! Use a StringBuilder instead! Passing an immutable object to a function known to change it is very nasty indeed (as I said earlier).
Ideological Purity is no substitute for being able to stick your thumb down a pipe to stop the water
-
Verify again, it's private, i just tested to make sure. ALL members of a class are private for default, there is no exception to constructors, i just tested like this: My class:
public class Form { Form() { } }
i used a project that i was working on, so this is a MVC 3 project, my controller:
public class SurveyController : Controller { public SurveyController() { Form form = new Form(); } }
this yields this compiler error:
Error 1 'FormularioAvaliacaoSaude.Models.Formulario.Formulario()' is inaccessible due to its protection level C:\workspace\FormularioAvaliacaoSaude\FormularioAvaliacaoSaude\Controllers\PesquisaController.cs 22 31 FormularioAvaliacaoSaude
(sorry for don't translating the paths on the error message, but i fell like i'll screw it up if i do it...) by this error i make the conclusion that the default Access Modifier. ... Just run into this on MSDN:
MSDN wrote:
The declaration of the empty constructor prevents the automatic generation of a default constructor. Note that if you don't use an access modifier with the constructor it will still be private by default. However, the private modifier is usually used explicitly to make it clear that the class cannot be instantiated.
I'm brazilian and english (well, human languages in general) aren't my best skill, so, sorry by my english. (if you want we can speak in C# or VB.Net =p)