|
Interesting, Richard. I am em-bare-assed to say that I can't explain (satisfactorily, to myself) exactly why adding the call to the base initializer makes this work. I assume it has something to do with the "parametric constructor" mentioned in various places I've searched for an answer to this.
cheers, Bill
«To kill an error's as good a service, sometimes better than, establishing new truth or fact.» Charles Darwin in "Prospero's Precepts"
|
|
|
|
|
I guess it's due to compiler error CS0188[^] - all fields in a struct have to be assigned by a constructor before the constructor can call a method in the struct .
Setting a property counts as calling a method on the struct , which you can't do until all of the fields have been assigned. Since you're using an automatic property, you can't directly access the backing field to initialize it. Therefore, the only way to initialize it is to call the default parameterless constructor (which all struct s have), which initializes all of the fields to their default values.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
What does the ": this()" do?
I can't find an explanation anywhere.
Removing it doesn't seem to have any effect.
If it's not broken, fix it until it is
|
|
|
|
|
You shouldn't be able to compile the code without it - you'll get compiler error CS0188[^] - "The 'this' object cannot be used before all of its fields are assigned to".
- All fields in a struct have to be assigned by a constructor before the constructor can call a method in the struct.
- Setting a property counts as calling a method on the struct, which you can't do until all of the fields have been assigned.
- Since you're using an automatic property, you can't directly access the backing field to initialize it.
- Therefore, the only way to initialize the field is to call the default parameterless constructor first.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
I just saw this on SO:
In C#, these are some common memory leaks:
•Not removing event listeners. Any event listener that is created with an anonymous method or lambda expression that references an outside object will keep those objects alive. Remember to remove event listeners when they are no longer used.
Can someone show me an example of this in an anonymous method? I'd like to see how C# looks like that causes this.
Thanks
If it's not broken, fix it until it is
|
|
|
|
|
Following in google seems to work for me
C# anonymous event listener example
|
|
|
|
|
So the reason I asked is because I have this:
using (WebClient client = new WebClient())
{
client.DownloadProgressChanged += (sender, e) =>
{
double bytesIn = double.Parse(e.BytesReceived.ToString());
double totalBytes = double.Parse(e.TotalBytesToReceive.ToString());
double percentage = bytesIn / totalBytes * 100;
file.PercentDone = Math.Truncate(percentage);
};
client.DownloadFileCompleted += (sender, e) =>
{
Files.Remove(file);
};
await client.DownloadFileTaskAsync(new Uri(file.FileName), outputFile);
}
I've never dealt with leaks before, and I'm handling the events using lamdas. Isn't there a protential here for a memory leak?
If it's not broken, fix it until it is
|
|
|
|
|
Do not know why the above post was deleted
|
|
|
|
|
I have a piece of code in c++ and I want to know how it can be in C# :
int m_it[MAX_BC];
int m_iKe[MAX_ROUNDS][MAX_BC];
char const* a_pchIn;
int* pi = m_it;
for(i=0; i<8; i++)
{
*pi = ((unsigned char)*(a_pchIn++) << 24);
*pi |= ((unsigned char)*(a_pchIn++) << 16);
*pi |= ((unsigned char)*(a_pchIn++) << 8);
(*(pi++) |= (unsigned char)*(a_pchIn++)) ^= m_iKe[0][i];
}
In C# ?
Thank you
|
|
|
|
|
This answer might erk a few programmers here in Discussions, but I can recall having a moderate amount of success taking C++ code verbatim and pasting it as C# code in the C# code behind module I was working on, attempting a compile, THEN ACTUALLY working from the compiler error list to clear the syntax breaks while F2-ing the HELP tome.
'Might try this if you find no other solution ...
|
|
|
|
|
Code--- C#
strHTML = "<table id='table1'> <colgroup><col width='190'/></colgroup><tbody>";
for (int i = 0; i < objDs.Tables[0].Rows.Count; i++)
{
if (i <= 10)
{
strUniqueID = "a" + i;
strBGColor = "a" + i.ToString();
}
else
{
strUniqueID = "a" + i;
strBGColor = "a" + (i - 1);
}
strSubject = objDs.Tables[0].Rows[i]["SubjectName"].ToString();
iSubjectID = Convert.ToInt32(objDs.Tables[0].Rows[i]["Subjectid"]);
<pre>
strHTML = strHTML + "<tr><td class='dark'><div id='" + strUniqueID + "' class='drag clone " + strBGColor + "'>" + strSubject + "</div><input id='b_" + strUniqueID + "' class='" + strUniqueID + "' type='button' value='' onclick='report(" + strUniqueID + ")' title='Show only " + strSubject + "'/></td></tr>";
}
strHTML = strHTML + "<tr><td class='trash' title='Trash'>Trash</td></tr>";
strHTML = strHTML + "</tbody></table>";
left.InnerHtml = strHTML;</pre>
---OutPut
English Test P | Kunal | Kunwar | Maths | Maths Test | Raj | Trash |
|
|
|
|
|
And?
You didn't ask a question...
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
I'm underwater on this
I used this tutorial
A Pretty Good Splash Screen in C#[^]
In the CloseForm, the Splash screen doesn't fade out, or just close and go away
hmm? In VB, you just add it, and it works. I'm stumped here.
So in my FormSplash I wrote [partial example]
public FormSplash()
{
InitializeComponent();
this.Text = String.Format("About {0}", AssemblyTitle);
this.ApplicationTitle.Text = AssemblyProduct;
this.Version.Text = String.Format("Version {0}", AssemblyVersion);
this.Copyright.Text = AssemblyCopyright;
}
static public void ShowSplashScreen()
{
if (ms_frmSplash != null)
return;
ms_oThread = new Thread(new ThreadStart(FormSplash.ShowForm));
ms_oThread.IsBackground = true;
ms_oThread.SetApartmentState(ApartmentState.STA);
ms_oThread.Start();
while (ms_frmSplash == null || ms_frmSplash.IsHandleCreated == false)
{
System.Threading.Thread.Sleep(TIMER_INTERVAL);<br />
}
}
static public void ShowForm()
{
ms_frmSplash = new FormSplash();
Application.Run(ms_frmSplash);<br />
}
static public void CloseForm()
{
if (ms_frmSplash != null && ms_frmSplash.IsDisposed == false)
{
ms_frmSplash.m_dblOpacityIncrement = -ms_frmSplash.m_dblOpacityDecrement;
}
ms_oThread = null;
ms_frmSplash = null;
}
And in my program.cs I wrote
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
FormSplash.ShowSplashScreen();
FormSplash.CloseForm();
Application.Run(new FormMain());
}
|
|
|
|
|
Why don't you set this.Cose(); as the last line of the ShowSplashScreen() method?
In Word you can only store 2 bytes. That is why I use Writer.
|
|
|
|
|
I got the can't do that because it was made on a different thread error. So I played around with it, but I think I need to scrape that idea and start again for the 4th time. It's on the back burner for now.
|
|
|
|
|
A few changes to your FormSplash should make it work.
add a delegate to your class to handle the form closing
delegate void CloseDelegate();
Add a method to handle the delegated form closing in a thread safe manner:
void DoClose()
{
if (this.InvokeRequired)
{
CloseDelegate d = new CloseDelegate(DoClose);
this.Invoke(d);
}
else
{
while (ms_frmSplash.Opacity > 0)
{
this.Opacity -= m_dblOpacityDecrement;
System.Threading.Thread.Sleep(TIMER_INTERVAL);
}
this.Close();
}
}
Change the CloseForm method to read:
static public void CloseForm()
{
if (ms_frmSplash != null && ms_frmSplash.IsDisposed == false)
{
ms_frmSplash.DoClose();
}
ms_oThread = null;
ms_frmSplash = null;
}
Note also I used the following values:
static int TIMER_INTERVAL = 1 * 1000;
double m_dblOpacityIncrement = .1;
double m_dblOpacityDecrement = .1;
[edit]
Updated to use proper cross-thread checking
[/edit]
modified 10-Apr-15 9:09am.
|
|
|
|
|
Thanks for bailing my rear out on this again Richard.
Works like a charm!, and the fade is really slow, but hey it works.
Why the 1 * 1000 on the timer interval?
I figured out it was a thread issue, but between this being my first 100% c# Windows Form App and learning more c#, it was a brain overload for me.
CloseDelegate DoClose
[FYI]
I bought a subscription to outsource.com, and scored my first job in 7 days. It was the only Microsoft Job that I had seen posted so I went for it. I had to learn c# anyways, and could use a library of code functions for later use.
So I figured what the heck and put a competitive price out for it and got the job. I should be done by today.
Interesting, the customer is a VB6 programmer, and wanted to test the concept of using one DAL for a Win App, MVC 5, and a WPF project as a single source of data using Entity Framework. So I thought I was going to do a MVC 5 Job, but turned out to be a C# win app. Pretty cool, the DAL gets compiled as a DLL, and can be used by all the program types.
Thanks Richard!
|
|
|
|
|
Happy to help, Jim.
The 1 * 1000 (1 second) on the timer interval was just an arbitrary choice so I could see clearly what was happening. You can adjust it to your own requirements. Similarly the 0.1 (10%) on the m_dblOpacityDecrement is arbitrary. Just have a play with the numbers until you get the effect you want.
|
|
|
|
|
okeedokey on that.
I'll may be back here shortly so stay tuned.
Now I have to sort on Entity Framework, in which I've never used before.
|
|
|
|
|
This is my first c# Windows Form App that I'm working on here.
It worked fine, then I started modifying it, and I get this error in program.cs
I moved the form files into new folders to stay organized.
So I created a new project and double checked the project properties, and the main form code plus program.cs code and there identical. I don't get it.
History, c# is new to me, I code in VB.
Application.Run(new FormMain());
|
|
|
|
|
Sounds like your FormMain class doesn't have a parameterless constructor. You should have something like:
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
...
}
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Oh,
I added the event arg to that and forget about it.
This seems really different than a VB Form App
Thanks Richard!
|
|
|
|
|
jkirkerx wrote: This seems really different than a VB Form App
No, it's identical!
And why on earth would you "add the event arg" to a form constructor? IN C# or VB?
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|
|
I had no clue what I was doing. I had never really seen a c# Windows App before, and thought it was required. Well that bit me in the rear. But I'm floating above water now on this and starting to pick it up faster.
I got my Registry stuff working, learned ByRef vs ref. Didn't know VB had some helpers that made coding really easy, I guess I just need to learn the c# equivs.
|
|
|
|
|
jkirkerx wrote: Didn't know VB had some helpers that made coding really easy,
It does...but...they tend to bite you in the ass at run time, where C# tends to catch them at compile time which makes development quicker and improves reliability.
Bear in mind that VB and C# are the same "under the hood" and are in fact interchangeable (there are online tools that will do it for you - pretty well from C# to VB and "so-so" from VB to C# because it's only context that differentiates methods from arrays in VB - so have a look at them as well, but don;t rely on them to make you a "good" C# coder by writing it all in VB!
http://converter.telerik.com/[^] works pretty well.
http://www.developerfusion.com/tools/convert/csharp-to-vb/[^] I prefer, but it doesn't always work - gets overloaded I suspect.
Please, don't use the registry for new apps - it's restricted and likely to get more so thanks to the massive abuse it got in the early days. It's pretty easy to store data without the registry: Where should I store my data?[^] may help.
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
|
|
|
|