|
You need to study the materials that are made for studying purposes; they will teach you:
1. thinking in an object-oriented way, i.e. with classes and objects
2. getting an overall grasp of a language, so you know, rather than think you know, what capabilities have been provided.
Reading a book will, in an orderly fashion, provide you with most all of the answers to the hundreds of questions you otherwise will come up with in random order; you better invest a few days learning all the concepts and possibilities, rather than wasting the same or more time in stumbling around and learning not much.
|
|
|
|
|
Hi Luc.
I seem to learn the best from code examples.
There use to be the complete code of programs on the internet but it seems more difficult to find these days...maybe people don't want their programs copied and like to keep their code to themselves.
Cope examples are good but there are times when you like to view the complete picture.
Brian
|
|
|
|
|
|
|
Member 14154627 wrote: I had considered using Lists but I think there was no direct access to the data in a list except using the foreach command.
No, a List<T> is a "self expanding array" and can be accessed in the same way as an array:
List<string> items = new List<string>();
items.Add("Hello");
items.Add("World");
Console.Writeline(items[0] + " " + items[1]);
For reference there is this: List<T> - Is it really as efficient as you probably think?[^] - don't look at it too hard now, it may be a little more advanced than you need at the moment.
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
modified 28-Mar-19 11:12am.
|
|
|
|
|
Thanks Griff.
I haven't used List<t> before so I hope to try it out by typing some example code.
Brian
|
|
|
|
|
Stop doing that. Stop "trying it out" and "study it first" - then learn to use it effectively.
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
I did manage to come across a very good site that has a step by step guide of putting together a C# program. This should show me the whole picture of how things work together.
[DELETED]
Brian
-- modified 2-Apr-19 1:56am.
|
|
|
|
|
Your other message with the same site came up in moderation - rightly - and has been closed as spam.
I edited this one to remove the very similar link.
PLease don't post links to "tutorial sites" again, as you will get flagged as a spammer and thrown off the site. I haven't started the process this time as I think it's innocent, or at least probably innocent, but if you post more then someone will.
We don't like spammers, or people who look like spammers - understandable as this site it entirely paid for by advertising and letting people advertise for free would kill that revenue stream and the siet would close.
So when you post a message like "I found this wonderful site ... url ..." you are going to be closed down pretty rapidly. Be told!
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Looks like I should have read the rules to this site before posting.
I'm used to seeing links in other sites.
Thanks for pointing this out to me.
Brian
|
|
|
|
|
One thing I don't understand Griff, I was given a link on this site to download a free book on C# (DotNetBookZero), how is that different from what I did by providing a link to a free pdf file that can be downloaded. Also some on this site have given me direct links to books I can buy on C#.
Brian
|
|
|
|
|
Well, a lot of guys that come from the C/C++ world into C# really struggle with the memory management aspects of .Net. Like me.
I have a static Globals class in pretty much every project I develop. Most of the stuff in my Globals classes are methods that don't really make sense to put into any other non-static class. Along with those methods, I have properties that only need to be set once in the program (many times, it's a complex object or list of objects), or that simplify access to system methods/vars (to ease typing elsewhere in the app).
".45 ACP - because shooting twice is just silly" - JSOP, 2010 ----- You can never have too much ammo - unless you're swimming, or on fire. - JSOP, 2010 ----- When you pry the gun from my cold dead hands, be careful - the barrel will be very hot. - JSOP, 2013
|
|
|
|
|
I've just looked at the Java forum - thanks Richard - and seen what you are trying to do, and I was right: your design is poor.
Why do you need a global variable for "current room", or "inventory"?
Think about it: your player is in a current room, your player has an inventory - and that's true for each player in the game, regardless of whether you have a dozen players or one.
So you make the Location part of each object (including player, swords, bullets, bad guys, whatever - they have a "Location" in the game) and Inventory a part of the player (and probably the bad guy). When you pick something up, it gets added to the objects collection of the inventory of the player. Drop it, and you remove it from the player inventory and added to the room inventory, or the level, or world inventory. Use it, and you remove it from the inventory and discard it.
You pass a Player and possibly a room or level to your methods and they access the items from that.
Global variables aren't needed, and it becomes a whole load easier to add a party of adventurers or whatever to your game instead of a single player.
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Hi Griff.
In answer to your question.
The program is designed to not just play a certain adventure but to be able to load many compiled adventures. The person writes his adventure as a script file. The script file is compiled using the adventure compiler then the adventure driver loads the compiled adventure to play the came.
You need to know what room the player is in (current room) so yu can list the objects in that room and if the player tried to pick up an object then the condition is that the object has to be in the same room as the player (current room and Object Location is used to check for this.
Brian
|
|
|
|
|
That's why you have a Room class, and a Player class. Part of the Player Location is the Room he is in ...
You are thinking in a "C" language way, not an OOPs way - and that won't help you at all with C# apps. Start considering your game as composed of objects which "know" how to do things to themselves instead of trying to think of the "program" as being in charge and deciding what to do.
For example, a Player might have a WalkForward method, which internally finds the Room he is in, finds his location in the room, finds which way he is facing, and asks the Room to move one step in that direction. The Room checks if there is a wall in the way, or a pit full of Grues, or a heavy weight about to drop on that square and returns a result to the Player method which updates its location or takes damage. The Room doesn't care which player it is, the Player doesn't care which Room it is - they just use the data they have to work with any Room / Player combination.
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
Hi Griff.
I have come from a background of programming in Basic then Visual Basic, so I tend to slip into this type of programming.
I understand that the class method is a more modern way to program. It's just getting my head around classes even when reading about them.
Brian
|
|
|
|
|
And it shows!
Instead of trying to get your head round how C# and OOPs design works, you're trying to force the code into your older methodology - and that doesn't produce good code!
Modern software thinks in terms of objects and instances, just the same as you do in the "real world". You wouldn't create an array of all Cars and try to move them all relative to each other in the real world, you would create a CarPark with a collection of Levels, each of which would have a collection of ParkingSpaces - your Car instances would then park in a free ParkingSpace without any reference to where the other cars are parked because it's irrelevant - all you want to know is "is this space free", you don't care if it's Car[0], or Car[1], or Car[n] that is in the space, do you?
And that is exactly what you do in the real world: you enter the car park then drive through it looking for the first empty space. When you leave, you go to the level you parked on, then to the space (and hope your car is still there). You drive out of the car park, and you are in a different area: the high street, which connects to Millers Lane at one end and the Bypass at the other. So why would you care about Sesame Street, which is half way across town? The High St "knows" what it's connected to: CarPark, Millers Lane, Bypass. And so on. So the the whole topology of the town is arranged as a series of connected places: Sesame St, Bypass, Millers Lane, High Street, etc. - they only need to know what they are connected to because that "lays out" how the town is arranged.
Think about it, read the books - and this time don't skip stuff because "I know this from Basic" but try and get your head around how Object Oriented Programming helps you to reflect the real world more easily!
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
I have some registry values:
[HKEY_CLASSES_ROOT\WinZip\Shell\Unzip_Model]@="Unzip Model"
[HKEY_CLASSES_ROOT\WinZip\Shell\Unzip_Model\command]@="\"D:\TeklaZipping\TeklaZipping.exe\" \"%1\" "
I am trying to read the value prior to correcting it if wrong:
RegistryKey UnZipping = Registry.ClassesRoot.OpenSubKey(@"WinZip\Shell\Unzip_Model");
if (UnZipping != null)
{
whattodo = UnZipping.GetValue("command").ToString();
UnZipping.Close();
}
the line
whattodo = UnZipping.GetValue("command").ToString();
always gives an error System.NullReferenceException. "Object reference not set to an instance of an object."
I've tried with "(Default)" instead of "command" and various other possibilities but get the same error. Clearly there is something here I don;t understand, can anyone help?
|
|
|
|
|
This might be relevant?
Basically there are 2 registry databases. a 64 bit and 32 bit one. Kind of messed up.... But workable!
|
|
|
|
|
This is one of the most common problems we get asked, and it's also the one we are least equipped to answer, but you are most equipped to answer yourself.
Let me just explain what the error means: You have tried to use a variable, property, or a method return value but it contains null - which means that there is no instance of a class in the variable.
It's a bit like a pocket: you have a pocket in your shirt, which you use to hold a pen. If you reach into the pocket and find there isn't a pen there, you can't sign your name on a piece of paper - and you will get very funny looks if you try! The empty pocket is giving you a null value (no pen here!) so you can't do anything that you would normally do once you retrieved your pen. Why is it empty? That's the question - it may be that you forgot to pick up your pen when you left the house this morning, or possibly you left the pen in the pocket of yesterdays shirt when you took it off last night.
We can't tell, because we weren't there, and even more importantly, we can't even see your shirt, much less what is in the pocket!
Back to computers, and you have done the same thing, somehow - and we can't see your code, much less run it and find out what contains null when it shouldn't.
But you can - and Visual Studio will help you here. Run your program in the debugger and when it fails, VS will show you the line it found the problem on. You can then start looking at the various parts of it to see what value is null and start looking back through your code to find out why. So put a breakpoint at the beginning of the method containing the error line, and run your program from the start again. This time, VS will stop before the error, and let you examine what is going on by stepping through the code looking at your values.
But we can't do that - we don't have your code, we don't know how to use it if we did have it, we don't have your data. So try it - and see how much information you can find out!
But even then, I'd strongly advise against using the registry unless you really have to: access to it is restricted and becoming more so with each version of Windows. (Mostly because it was abused a lot when it was first released, leading to some truly horrendous file sizes and damage.) If possible, store your info somewhere else: a config file or similar is a good idea.
Sent from my Amstrad PC 1640
Never throw anything away, Griff
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
AntiTwitter: @DalekDave is now a follower!
|
|
|
|
|
|
Working with ASP.NET Core and OData v4
I get a
Quote:
InvalidOperationException: The path template 'Classes({key})/Bookings({bookingKey})' on the action 'GetBooking' in controller 'Classes' is not a valid OData path template. Bad Request - Error in query syntax.
I don't see the error in query syntax. Here is the full code of this method in my controller 'Classes'
[HttpGet]
[ODataRoute("Classes({key})/Bookings({bookingKey})")]
public async Task<IActionResult> GetBooking([FromODataUri] Guid key, [FromODataUri] Guid bookingKey)
{
var @class = await _context.Classes.FirstOrDefaultAsync(y => y.Id == key);
if (@class == null)
{
return NotFound();
}
var booking = _context.Bookings.Where(y => y.Class.Id == key && y.Id == bookingKey);
if (!booking.Any())
{
return NotFound();
}
return Ok(SingleResult.Create(booking));
}
This method is defined in 'Classes' Controller. I also have a GeBookings method and 2 actions methods defined that cause no issue. When I comment my GetBooking() method I don't have any error.
Booking is a [Contained] ICollection of Booking
public class Class
{
[Key]
public Guid Id { get; set; }
[Contained]
public ICollection<Booking> Bookings {get; set;}
}
Maybe I need to do a pause but I really cannot see my error. Were should I look?
Bastien
|
|
|
|
|
Asking for trouble:
public class Class
"(I) am amazed to see myself here rather than there ... now rather than then".
― Blaise Pascal
|
|
|
|
|
C# is not case-sensitive.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
"If you just follow the bacon Eddy, wherever it leads you, then you won't have to think about politics." -- Some Bell.
|
|
|
|
|
It gets fun if you try and consume it in a language like VB.NET though.
This space for rent
|
|
|
|
|